diff --git a/api/app/clients/OpenAIClient.js b/api/app/clients/OpenAIClient.js index 6afb5d8cb3..78679493ef 100644 --- a/api/app/clients/OpenAIClient.js +++ b/api/app/clients/OpenAIClient.js @@ -37,11 +37,11 @@ const { addSpaceIfNeeded, sleep } = require('~/server/utils'); const { getAppConfig } = require('~/server/services/Config'); const { spendTokens } = require('~/models/spendTokens'); const { handleOpenAIErrors } = require('./tools/util'); -const { createLLM, RunManager } = require('./llm'); const { summaryBuffer } = require('./memory'); const { runTitleChain } = require('./chains'); const { tokenSplit } = require('./document'); const BaseClient = require('./BaseClient'); +const { createLLM } = require('./llm'); const { logger } = require('~/config'); class OpenAIClient extends BaseClient { @@ -619,10 +619,6 @@ class OpenAIClient extends BaseClient { temperature = 0.2, max_tokens, streaming, - context, - tokenBuffer, - initialMessageCount, - conversationId, }) { const modelOptions = { modelName: modelName ?? model, @@ -667,22 +663,12 @@ class OpenAIClient extends BaseClient { configOptions.httpsAgent = new HttpsProxyAgent(this.options.proxy); } - const { req, res, debug } = this.options; - const runManager = new RunManager({ req, res, debug, abortController: this.abortController }); - this.runManager = runManager; - const llm = createLLM({ modelOptions, configOptions, openAIApiKey: this.apiKey, azure: this.azure, streaming, - callbacks: runManager.createCallbacks({ - context, - tokenBuffer, - conversationId: this.conversationId ?? conversationId, - initialMessageCount, - }), }); return llm; diff --git a/api/app/clients/callbacks/createStartHandler.js b/api/app/clients/callbacks/createStartHandler.js deleted file mode 100644 index b7292aaf17..0000000000 --- a/api/app/clients/callbacks/createStartHandler.js +++ /dev/null @@ -1,95 +0,0 @@ -const { promptTokensEstimate } = require('openai-chat-tokens'); -const { EModelEndpoint, supportsBalanceCheck } = require('librechat-data-provider'); -const { formatFromLangChain } = require('~/app/clients/prompts'); -const { getBalanceConfig } = require('~/server/services/Config'); -const { checkBalance } = require('~/models/balanceMethods'); -const { logger } = require('~/config'); - -const createStartHandler = ({ - context, - conversationId, - tokenBuffer = 0, - initialMessageCount, - manager, -}) => { - return async (_llm, _messages, runId, parentRunId, extraParams) => { - const { invocation_params } = extraParams; - const { model, functions, function_call } = invocation_params; - const messages = _messages[0].map(formatFromLangChain); - - logger.debug(`[createStartHandler] handleChatModelStart: ${context}`, { - model, - function_call, - }); - - if (context !== 'title') { - logger.debug(`[createStartHandler] handleChatModelStart: ${context}`, { - functions, - }); - } - - const payload = { messages }; - let prelimPromptTokens = 1; - - if (functions) { - payload.functions = functions; - prelimPromptTokens += 2; - } - - if (function_call) { - payload.function_call = function_call; - prelimPromptTokens -= 5; - } - - prelimPromptTokens += promptTokensEstimate(payload); - logger.debug('[createStartHandler]', { - prelimPromptTokens, - tokenBuffer, - }); - prelimPromptTokens += tokenBuffer; - - try { - const balance = await getBalanceConfig(); - if (balance?.enabled && supportsBalanceCheck[EModelEndpoint.openAI]) { - const generations = - initialMessageCount && messages.length > initialMessageCount - ? messages.slice(initialMessageCount) - : null; - await checkBalance({ - req: manager.req, - res: manager.res, - txData: { - user: manager.user, - tokenType: 'prompt', - amount: prelimPromptTokens, - debug: manager.debug, - generations, - model, - endpoint: EModelEndpoint.openAI, - }, - }); - } - } catch (err) { - logger.error(`[createStartHandler][${context}] checkBalance error`, err); - manager.abortController.abort(); - if (context === 'summary' || context === 'plugins') { - manager.addRun(runId, { conversationId, error: err.message }); - throw new Error(err); - } - return; - } - - manager.addRun(runId, { - model, - messages, - functions, - function_call, - runId, - parentRunId, - conversationId, - prelimPromptTokens, - }); - }; -}; - -module.exports = createStartHandler; diff --git a/api/app/clients/callbacks/index.js b/api/app/clients/callbacks/index.js deleted file mode 100644 index 33f7365522..0000000000 --- a/api/app/clients/callbacks/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const createStartHandler = require('./createStartHandler'); - -module.exports = { - createStartHandler, -}; diff --git a/api/app/clients/llm/RunManager.js b/api/app/clients/llm/RunManager.js deleted file mode 100644 index 51abe480a9..0000000000 --- a/api/app/clients/llm/RunManager.js +++ /dev/null @@ -1,105 +0,0 @@ -const { createStartHandler } = require('~/app/clients/callbacks'); -const { spendTokens } = require('~/models/spendTokens'); -const { logger } = require('~/config'); - -class RunManager { - constructor(fields) { - const { req, res, abortController, debug } = fields; - this.abortController = abortController; - this.user = req.user.id; - this.req = req; - this.res = res; - this.debug = debug; - this.runs = new Map(); - this.convos = new Map(); - } - - addRun(runId, runData) { - if (!this.runs.has(runId)) { - this.runs.set(runId, runData); - if (runData.conversationId) { - this.convos.set(runData.conversationId, runId); - } - return runData; - } else { - const existingData = this.runs.get(runId); - const update = { ...existingData, ...runData }; - this.runs.set(runId, update); - if (update.conversationId) { - this.convos.set(update.conversationId, runId); - } - return update; - } - } - - removeRun(runId) { - if (this.runs.has(runId)) { - this.runs.delete(runId); - } else { - logger.error(`[api/app/clients/llm/RunManager] Run with ID ${runId} does not exist.`); - } - } - - getAllRuns() { - return Array.from(this.runs.values()); - } - - getRunById(runId) { - return this.runs.get(runId); - } - - getRunByConversationId(conversationId) { - const runId = this.convos.get(conversationId); - return { run: this.runs.get(runId), runId }; - } - - createCallbacks(metadata) { - return [ - { - handleChatModelStart: createStartHandler({ ...metadata, manager: this }), - handleLLMEnd: async (output, runId, _parentRunId) => { - const { llmOutput, ..._output } = output; - logger.debug(`[RunManager] handleLLMEnd: ${JSON.stringify(metadata)}`, { - runId, - _parentRunId, - llmOutput, - }); - - if (metadata.context !== 'title') { - logger.debug('[RunManager] handleLLMEnd:', { - output: _output, - }); - } - - const { tokenUsage } = output.llmOutput; - const run = this.getRunById(runId); - this.removeRun(runId); - - const txData = { - user: this.user, - model: run?.model ?? 'gpt-3.5-turbo', - ...metadata, - }; - - await spendTokens(txData, tokenUsage); - }, - handleLLMError: async (err) => { - logger.error(`[RunManager] handleLLMError: ${JSON.stringify(metadata)}`, err); - if (metadata.context === 'title') { - return; - } else if (metadata.context === 'plugins') { - throw new Error(err); - } - const { conversationId } = metadata; - const { run } = this.getRunByConversationId(conversationId); - if (run && run.error) { - const { error } = run; - throw new Error(error); - } - }, - }, - ]; - } -} - -module.exports = RunManager; diff --git a/api/app/clients/llm/index.js b/api/app/clients/llm/index.js index 2e09bbb841..d03e1cda4d 100644 --- a/api/app/clients/llm/index.js +++ b/api/app/clients/llm/index.js @@ -1,9 +1,7 @@ const createLLM = require('./createLLM'); -const RunManager = require('./RunManager'); const createCoherePayload = require('./createCoherePayload'); module.exports = { createLLM, - RunManager, createCoherePayload, };