🪙 refactor: Collected Usage & Anthropic Prompt Caching (#11319)
Some checks are pending
Docker Dev Branch Images Build / build (Dockerfile, lc-dev, node) (push) Waiting to run
Docker Dev Branch Images Build / build (Dockerfile.multi, lc-dev-api, api-build) (push) Waiting to run
Docker Dev Images Build / build (Dockerfile, librechat-dev, node) (push) Waiting to run
Docker Dev Images Build / build (Dockerfile.multi, librechat-dev-api, api-build) (push) Waiting to run
Sync Locize Translations & Create Translation PR / Sync Translation Keys with Locize (push) Waiting to run
Sync Locize Translations & Create Translation PR / Create Translation PR on Version Published (push) Blocked by required conditions

* 🔧 refactor: Improve token calculation in AgentClient.recordCollectedUsage

- Updated the token calculation logic to sum output tokens directly from all entries, addressing issues with negative values in parallel execution scenarios.
- Added comments for clarity on the usage of input tokens and output tokens.
- Introduced a new test file for comprehensive testing of the recordCollectedUsage function, covering various execution scenarios including sequential and parallel processing, cache token handling, and model fallback logic.

* 🔧 refactor: Anthropic `promptCache` handling in LLM configuration

* 🔧 test: Add comprehensive test for cache token handling in recordCollectedUsage

- Introduced a new test case to validate the handling of cache tokens across multiple tool calls in the recordCollectedUsage function.
- Ensured correct calculations for input and output tokens, including scenarios with cache creation and reading.
- Verified the expected interactions with token spending methods to enhance the robustness of the token management logic.
This commit is contained in:
Danny Avila 2026-01-12 23:02:08 -05:00 committed by GitHub
parent 1329e16d3a
commit 2a50c372ef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 828 additions and 40 deletions

View file

@ -39,6 +39,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
type: 'enabled',
budget_tokens: 2000,
},
promptCache: true,
},
},
configOptions: {
@ -87,6 +88,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
type: 'enabled',
budget_tokens: 3000,
},
promptCache: true,
},
},
configOptions: {
@ -134,6 +136,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
user_id: 'user123',
},
topK: 50,
promptCache: true,
},
},
configOptions: {
@ -175,6 +178,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
metadata: {
user_id: 'user456',
},
promptCache: true,
},
},
configOptions: {
@ -187,7 +191,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
});
});
it('should apply custom headers without anthropic-beta for models that dont need it', () => {
it('should apply custom headers and promptCache for models that support caching', () => {
const apiKey = 'sk-custom';
const endpoint = 'Anthropic (via LiteLLM)';
const options = {
@ -218,6 +222,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
metadata: {
user_id: undefined,
},
promptCache: true,
},
},
configOptions: {
@ -300,6 +305,9 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
stream: true,
topP: 0.9,
maxTokens: 2048,
modelKwargs: {
promptCache: true,
},
// temperature is dropped
// modelKwargs.topK is dropped
// modelKwargs.metadata is dropped completely
@ -379,6 +387,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
metadata: {
user_id: 'searchUser',
},
promptCache: true,
},
},
configOptions: {
@ -425,6 +434,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
user_id: 'testUser',
},
topK: 40,
promptCache: true,
},
},
configOptions: {
@ -470,6 +480,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
metadata: {
user_id: 'addUser',
},
promptCache: true,
customParam1: 'value1', // Unknown params added to modelKwargs
customParam2: 42,
},
@ -519,6 +530,7 @@ describe('getOpenAIConfig - Anthropic Compatibility', () => {
metadata: {
user_id: 'bothUser',
},
promptCache: true,
customParam: 'customValue',
// topK is dropped
},