diff --git a/api/models/tx.js b/api/models/tx.js index 1b37ffc865..ccd865fc8d 100644 --- a/api/models/tx.js +++ b/api/models/tx.js @@ -17,6 +17,7 @@ const tokenValues = { 'gpt-3.5-turbo-0125': { prompt: 0.5, completion: 1.5 }, 'claude-3-opus': { prompt: 15, completion: 75 }, 'claude-3-sonnet': { prompt: 3, completion: 15 }, + 'claude-3-5-sonnet': { prompt: 3, completion: 15 }, 'claude-3-haiku': { prompt: 0.25, completion: 1.25 }, 'claude-2.1': { prompt: 8, completion: 24 }, 'claude-2': { prompt: 8, completion: 24 }, diff --git a/api/models/tx.spec.js b/api/models/tx.spec.js index ce7d227d51..560b7da33d 100644 --- a/api/models/tx.spec.js +++ b/api/models/tx.spec.js @@ -48,6 +48,13 @@ describe('getValueKey', () => { expect(getValueKey('gpt-4o-turbo')).toBe('gpt-4o'); expect(getValueKey('gpt-4o-0125')).toBe('gpt-4o'); }); + + it('should return "claude-3-5-sonnet" for model type of "claude-3-5-sonnet-"', () => { + expect(getValueKey('claude-3-5-sonnet-20240620')).toBe('claude-3-5-sonnet'); + expect(getValueKey('anthropic/claude-3-5-sonnet')).toBe('claude-3-5-sonnet'); + expect(getValueKey('claude-3-5-sonnet-turbo')).toBe('claude-3-5-sonnet'); + expect(getValueKey('claude-3-5-sonnet-0125')).toBe('claude-3-5-sonnet'); + }); }); describe('getMultiplier', () => { diff --git a/api/utils/tokens.js b/api/utils/tokens.js index 3b973c40cf..1ff0c4340d 100644 --- a/api/utils/tokens.js +++ b/api/utils/tokens.js @@ -96,6 +96,7 @@ const anthropicModels = { 'claude-3-haiku': 200000, 'claude-3-sonnet': 200000, 'claude-3-opus': 200000, + 'claude-3-5-sonnet': 200000, }; const aggregateModels = { ...openAIModels, ...googleModels, ...anthropicModels, ...cohereModels }; diff --git a/api/utils/tokens.spec.js b/api/utils/tokens.spec.js index 228e298605..afcd4b217a 100644 --- a/api/utils/tokens.spec.js +++ b/api/utils/tokens.spec.js @@ -124,12 +124,29 @@ describe('getModelMaxTokens', () => { 'claude-1-100k', 'claude-instant-1', 'claude-instant-1-100k', + 'claude-3-haiku', + 'claude-3-sonnet', + 'claude-3-opus', + 'claude-3-5-sonnet', ]; - const claudeMaxTokens = maxTokensMap[EModelEndpoint.anthropic]['claude-']; - const claude21MaxTokens = maxTokensMap[EModelEndpoint.anthropic]['claude-2.1']; + const maxTokens = { + 'claude-': maxTokensMap[EModelEndpoint.anthropic]['claude-'], + 'claude-2.1': maxTokensMap[EModelEndpoint.anthropic]['claude-2.1'], + 'claude-3': maxTokensMap[EModelEndpoint.anthropic]['claude-3-sonnet'], + }; + models.forEach((model) => { - const expectedTokens = model === 'claude-2.1' ? claude21MaxTokens : claudeMaxTokens; + let expectedTokens; + + if (model === 'claude-2.1') { + expectedTokens = maxTokens['claude-2.1']; + } else if (model.startsWith('claude-3')) { + expectedTokens = maxTokens['claude-3']; + } else { + expectedTokens = maxTokens['claude-']; + } + expect(getModelMaxTokens(model, EModelEndpoint.anthropic)).toEqual(expectedTokens); }); }); diff --git a/package-lock.json b/package-lock.json index b9df8a03f2..5bb82fbae7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29348,7 +29348,7 @@ }, "packages/data-provider": { "name": "librechat-data-provider", - "version": "0.6.9", + "version": "0.7.0", "license": "ISC", "dependencies": { "@types/js-yaml": "^4.0.9", diff --git a/packages/data-provider/package.json b/packages/data-provider/package.json index b056524dc6..97635f9aee 100644 --- a/packages/data-provider/package.json +++ b/packages/data-provider/package.json @@ -1,6 +1,6 @@ { "name": "librechat-data-provider", - "version": "0.6.9", + "version": "0.7.0", "description": "data services for librechat apps", "main": "dist/index.js", "module": "dist/index.es.js", diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index 1bc5413d8c..0f1665f1b5 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -473,6 +473,7 @@ export const defaultModels = { 'code-bison-32k', ], [EModelEndpoint.anthropic]: [ + 'claude-3-5-sonnet-20240620', 'claude-3-opus-20240229', 'claude-3-sonnet-20240229', 'claude-3-haiku-20240307',