🔁 refactor: Token Event Handler and Standardize maxTokens Key (#6886)

* refactor: agent token handling to use createHandleLLMNewToken for improved closure

* refactor: update llmConfig to use maxTokens instead of max_tokens for consistency
This commit is contained in:
Danny Avila 2025-04-14 22:38:35 -04:00 committed by GitHub
parent 52b3ed54ca
commit c49f883e1a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 24 additions and 19 deletions

View file

@ -1,6 +1,7 @@
const fetch = require('node-fetch'); const fetch = require('node-fetch');
const { GraphEvents } = require('@librechat/agents'); const { GraphEvents } = require('@librechat/agents');
const { logger, sendEvent } = require('~/config'); const { logger, sendEvent } = require('~/config');
const { sleep } = require('~/server/utils');
/** /**
* Makes a function to make HTTP request and logs the process. * Makes a function to make HTTP request and logs the process.
@ -55,7 +56,16 @@ function createStreamEventHandlers(res) {
}; };
} }
function createHandleLLMNewToken(streamRate) {
return async () => {
if (streamRate) {
await sleep(streamRate);
}
};
}
module.exports = { module.exports = {
createFetch, createFetch,
createHandleLLMNewToken,
createStreamEventHandlers, createStreamEventHandlers,
}; };

View file

@ -8,7 +8,7 @@ const {
removeNullishValues, removeNullishValues,
} = require('librechat-data-provider'); } = require('librechat-data-provider');
const { getUserKey, checkUserKeyExpiry } = require('~/server/services/UserService'); const { getUserKey, checkUserKeyExpiry } = require('~/server/services/UserService');
const { sleep } = require('~/server/utils'); const { createHandleLLMNewToken } = require('~/app/clients/generators');
const getOptions = async ({ req, overrideModel, endpointOption }) => { const getOptions = async ({ req, overrideModel, endpointOption }) => {
const { const {
@ -90,12 +90,7 @@ const getOptions = async ({ req, overrideModel, endpointOption }) => {
llmConfig.callbacks = [ llmConfig.callbacks = [
{ {
handleLLMNewToken: async () => { handleLLMNewToken: createHandleLLMNewToken(streamRate),
if (!streamRate) {
return;
}
await sleep(streamRate);
},
}, },
]; ];

View file

@ -9,9 +9,10 @@ const { Providers } = require('@librechat/agents');
const { getUserKeyValues, checkUserKeyExpiry } = require('~/server/services/UserService'); const { getUserKeyValues, checkUserKeyExpiry } = require('~/server/services/UserService');
const { getLLMConfig } = require('~/server/services/Endpoints/openAI/llm'); const { getLLMConfig } = require('~/server/services/Endpoints/openAI/llm');
const { getCustomEndpointConfig } = require('~/server/services/Config'); const { getCustomEndpointConfig } = require('~/server/services/Config');
const { createHandleLLMNewToken } = require('~/app/clients/generators');
const { fetchModels } = require('~/server/services/ModelService'); const { fetchModels } = require('~/server/services/ModelService');
const { isUserProvided, sleep } = require('~/server/utils');
const OpenAIClient = require('~/app/clients/OpenAIClient'); const OpenAIClient = require('~/app/clients/OpenAIClient');
const { isUserProvided } = require('~/server/utils');
const getLogStores = require('~/cache/getLogStores'); const getLogStores = require('~/cache/getLogStores');
const { PROXY } = process.env; const { PROXY } = process.env;
@ -148,9 +149,7 @@ const initializeClient = async ({ req, res, endpointOption, optionsOnly, overrid
} }
options.llmConfig.callbacks = [ options.llmConfig.callbacks = [
{ {
handleLLMNewToken: async () => { handleLLMNewToken: createHandleLLMNewToken(clientOptions.streamRate),
await sleep(customOptions.streamRate);
},
}, },
]; ];
return options; return options;

View file

@ -6,16 +6,11 @@ const {
} = require('librechat-data-provider'); } = require('librechat-data-provider');
const { getUserKeyValues, checkUserKeyExpiry } = require('~/server/services/UserService'); const { getUserKeyValues, checkUserKeyExpiry } = require('~/server/services/UserService');
const { getLLMConfig } = require('~/server/services/Endpoints/openAI/llm'); const { getLLMConfig } = require('~/server/services/Endpoints/openAI/llm');
const { isEnabled, isUserProvided, sleep } = require('~/server/utils'); const { createHandleLLMNewToken } = require('~/app/clients/generators');
const { isEnabled, isUserProvided } = require('~/server/utils');
const OpenAIClient = require('~/app/clients/OpenAIClient'); const OpenAIClient = require('~/app/clients/OpenAIClient');
const { getAzureCredentials } = require('~/utils'); const { getAzureCredentials } = require('~/utils');
function createHandleNewToken(streamRate) {
async () => {
await sleep(streamRate);
};
}
const initializeClient = async ({ const initializeClient = async ({
req, req,
res, res,
@ -152,7 +147,7 @@ const initializeClient = async ({
} }
options.llmConfig.callbacks = [ options.llmConfig.callbacks = [
{ {
handleLLMNewToken: createHandleNewToken(streamRate), handleLLMNewToken: createHandleLLMNewToken(streamRate),
}, },
]; ];
return options; return options;

View file

@ -153,6 +153,12 @@ function getLLMConfig(apiKey, options = {}, endpoint = null) {
delete llmConfig.reasoning_effort; delete llmConfig.reasoning_effort;
} }
if (llmConfig?.['max_tokens'] != null) {
/** @type {number} */
llmConfig.maxTokens = llmConfig['max_tokens'];
delete llmConfig['max_tokens'];
}
return { return {
/** @type {OpenAIClientOptions} */ /** @type {OpenAIClientOptions} */
llmConfig, llmConfig,