diff --git a/server/utils/AiProviders/openRouter/index.js b/server/utils/AiProviders/openRouter/index.js index 7a0fc1c355f..542b3fe675c 100644 --- a/server/utils/AiProviders/openRouter/index.js +++ b/server/utils/AiProviders/openRouter/index.js @@ -238,7 +238,7 @@ class OpenRouterLLM { ]; } - async getChatCompletion(messages = null, { temperature = 0.7 }) { + async getChatCompletion(messages = null, { temperature = 0.7, user = null }) { if (!(await this.isValidChatCompletionModel(this.model))) throw new Error( `OpenRouter chat: ${this.model} is not valid for chat completion!` @@ -253,6 +253,9 @@ class OpenRouterLLM { // This is an OpenRouter specific option that allows us to get the reasoning text // before the token text. include_reasoning: true, + // Add user tracking if user information is available + // This enables OpenRouter's user tracking features for multi-user systems + ...(user ? { user } : {}), }) .catch((e) => { throw new Error(e.message); @@ -294,8 +297,10 @@ class OpenRouterLLM { // This is an OpenRouter specific option that allows us to get the reasoning text // before the token text. include_reasoning: true, + // Add user tracking if user information is available + // This enables OpenRouter's user tracking features for multi-user systems + ...(user ? { user } : {}), }), - messages // We have to manually count the tokens // OpenRouter has a ton of providers and they all can return slightly differently // some return chunk.usage on STOP, some do it after stop, its inconsistent. diff --git a/server/utils/chats/apiChatHandler.js b/server/utils/chats/apiChatHandler.js index d433df19291..0871e1c33cf 100644 --- a/server/utils/chats/apiChatHandler.js +++ b/server/utils/chats/apiChatHandler.js @@ -307,6 +307,7 @@ async function chatSync({ const { textResponse, metrics: performanceMetrics } = await LLMConnector.getChatCompletion(messages, { temperature: workspace?.openAiTemp ?? LLMConnector.defaultTemp, + user, }); if (!textResponse) { @@ -649,6 +650,7 @@ async function streamChat({ const { textResponse, metrics: performanceMetrics } = await LLMConnector.getChatCompletion(messages, { temperature: workspace?.openAiTemp ?? LLMConnector.defaultTemp, + user, }); completeText = textResponse; metrics = performanceMetrics; @@ -664,6 +666,7 @@ async function streamChat({ } else { const stream = await LLMConnector.streamGetChatCompletion(messages, { temperature: workspace?.openAiTemp ?? LLMConnector.defaultTemp, + user, }); completeText = await LLMConnector.handleStream(response, stream, { uuid }); metrics = stream.metrics; diff --git a/server/utils/chats/stream.js b/server/utils/chats/stream.js index 893a69415d5..3935f461bde 100644 --- a/server/utils/chats/stream.js +++ b/server/utils/chats/stream.js @@ -248,6 +248,7 @@ async function streamChatWithWorkspace( const { textResponse, metrics: performanceMetrics } = await LLMConnector.getChatCompletion(messages, { temperature: workspace?.openAiTemp ?? LLMConnector.defaultTemp, + user, }); completeText = textResponse; @@ -264,6 +265,7 @@ async function streamChatWithWorkspace( } else { const stream = await LLMConnector.streamGetChatCompletion(messages, { temperature: workspace?.openAiTemp ?? LLMConnector.defaultTemp, + user, }); completeText = await LLMConnector.handleStream(response, stream, { uuid,