mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
🤖 feat: Claude 3.5 Haiku (#4629)
This commit is contained in:
parent
2e519f9b57
commit
fc41032923
6 changed files with 28 additions and 4 deletions
|
|
@ -82,7 +82,7 @@ PROXY=
|
||||||
#============#
|
#============#
|
||||||
|
|
||||||
ANTHROPIC_API_KEY=user_provided
|
ANTHROPIC_API_KEY=user_provided
|
||||||
# ANTHROPIC_MODELS=claude-3-5-sonnet-20241022,claude-3-5-sonnet-latest,claude-3-5-sonnet-20240620,claude-3-opus-20240229,claude-3-sonnet-20240229,claude-3-haiku-20240307,claude-2.1,claude-2,claude-1.2,claude-1,claude-1-100k,claude-instant-1,claude-instant-1-100k
|
# ANTHROPIC_MODELS=claude-3-5-haiku-20241022,claude-3-5-sonnet-20241022,claude-3-5-sonnet-latest,claude-3-5-sonnet-20240620,claude-3-opus-20240229,claude-3-sonnet-20240229,claude-3-haiku-20240307,claude-2.1,claude-2,claude-1.2,claude-1,claude-1-100k,claude-instant-1,claude-instant-1-100k
|
||||||
# ANTHROPIC_REVERSE_PROXY=
|
# ANTHROPIC_REVERSE_PROXY=
|
||||||
|
|
||||||
#============#
|
#============#
|
||||||
|
|
|
||||||
|
|
@ -98,8 +98,8 @@ class AnthropicClient extends BaseClient {
|
||||||
);
|
);
|
||||||
|
|
||||||
const modelMatch = matchModelName(this.modelOptions.model, EModelEndpoint.anthropic);
|
const modelMatch = matchModelName(this.modelOptions.model, EModelEndpoint.anthropic);
|
||||||
this.isClaude3 = modelMatch.startsWith('claude-3');
|
this.isClaude3 = modelMatch.includes('claude-3');
|
||||||
this.isLegacyOutput = !modelMatch.startsWith('claude-3-5-sonnet');
|
this.isLegacyOutput = !modelMatch.includes('claude-3-5-sonnet');
|
||||||
this.supportsCacheControl =
|
this.supportsCacheControl =
|
||||||
this.options.promptCache && this.checkPromptCacheSupport(modelMatch);
|
this.options.promptCache && this.checkPromptCacheSupport(modelMatch);
|
||||||
|
|
||||||
|
|
@ -634,7 +634,7 @@ class AnthropicClient extends BaseClient {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (this.modelOptions.model.startsWith('claude-3')) {
|
if (this.modelOptions.model.includes('claude-3')) {
|
||||||
await buildMessagesPayload();
|
await buildMessagesPayload();
|
||||||
processTokens();
|
processTokens();
|
||||||
return {
|
return {
|
||||||
|
|
@ -687,6 +687,7 @@ class AnthropicClient extends BaseClient {
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
modelMatch === 'claude-3-5-sonnet' ||
|
modelMatch === 'claude-3-5-sonnet' ||
|
||||||
|
modelMatch === 'claude-3-5-haiku' ||
|
||||||
modelMatch === 'claude-3-haiku' ||
|
modelMatch === 'claude-3-haiku' ||
|
||||||
modelMatch === 'claude-3-opus'
|
modelMatch === 'claude-3-opus'
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,8 @@ const tokenValues = Object.assign(
|
||||||
'claude-3-sonnet': { prompt: 3, completion: 15 },
|
'claude-3-sonnet': { prompt: 3, completion: 15 },
|
||||||
'claude-3-5-sonnet': { prompt: 3, completion: 15 },
|
'claude-3-5-sonnet': { prompt: 3, completion: 15 },
|
||||||
'claude-3.5-sonnet': { prompt: 3, completion: 15 },
|
'claude-3.5-sonnet': { prompt: 3, completion: 15 },
|
||||||
|
'claude-3-5-haiku': { prompt: 1, completion: 5 },
|
||||||
|
'claude-3.5-haiku': { prompt: 1, completion: 5 },
|
||||||
'claude-3-haiku': { prompt: 0.25, completion: 1.25 },
|
'claude-3-haiku': { prompt: 0.25, completion: 1.25 },
|
||||||
'claude-2.1': { prompt: 8, completion: 24 },
|
'claude-2.1': { prompt: 8, completion: 24 },
|
||||||
'claude-2': { prompt: 8, completion: 24 },
|
'claude-2': { prompt: 8, completion: 24 },
|
||||||
|
|
@ -81,6 +83,8 @@ const tokenValues = Object.assign(
|
||||||
const cacheTokenValues = {
|
const cacheTokenValues = {
|
||||||
'claude-3.5-sonnet': { write: 3.75, read: 0.3 },
|
'claude-3.5-sonnet': { write: 3.75, read: 0.3 },
|
||||||
'claude-3-5-sonnet': { write: 3.75, read: 0.3 },
|
'claude-3-5-sonnet': { write: 3.75, read: 0.3 },
|
||||||
|
'claude-3.5-haiku': { write: 1.25, read: 0.1 },
|
||||||
|
'claude-3-5-haiku': { write: 1.25, read: 0.1 },
|
||||||
'claude-3-haiku': { write: 0.3, read: 0.03 },
|
'claude-3-haiku': { write: 0.3, read: 0.03 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,20 @@ describe('getValueKey', () => {
|
||||||
expect(getValueKey('claude-3.5-sonnet-turbo')).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');
|
expect(getValueKey('claude-3.5-sonnet-0125')).toBe('claude-3.5-sonnet');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should return "claude-3-5-haiku" for model type of "claude-3-5-haiku-"', () => {
|
||||||
|
expect(getValueKey('claude-3-5-haiku-20240620')).toBe('claude-3-5-haiku');
|
||||||
|
expect(getValueKey('anthropic/claude-3-5-haiku')).toBe('claude-3-5-haiku');
|
||||||
|
expect(getValueKey('claude-3-5-haiku-turbo')).toBe('claude-3-5-haiku');
|
||||||
|
expect(getValueKey('claude-3-5-haiku-0125')).toBe('claude-3-5-haiku');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return "claude-3.5-haiku" for model type of "claude-3.5-haiku-"', () => {
|
||||||
|
expect(getValueKey('claude-3.5-haiku-20240620')).toBe('claude-3.5-haiku');
|
||||||
|
expect(getValueKey('anthropic/claude-3.5-haiku')).toBe('claude-3.5-haiku');
|
||||||
|
expect(getValueKey('claude-3.5-haiku-turbo')).toBe('claude-3.5-haiku');
|
||||||
|
expect(getValueKey('claude-3.5-haiku-0125')).toBe('claude-3.5-haiku');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getMultiplier', () => {
|
describe('getMultiplier', () => {
|
||||||
|
|
@ -248,6 +262,8 @@ describe('getCacheMultiplier', () => {
|
||||||
it('should return the correct cache multiplier for a given valueKey and cacheType', () => {
|
it('should return the correct cache multiplier for a given valueKey and cacheType', () => {
|
||||||
expect(getCacheMultiplier({ valueKey: 'claude-3-5-sonnet', cacheType: 'write' })).toBe(3.75);
|
expect(getCacheMultiplier({ valueKey: 'claude-3-5-sonnet', cacheType: 'write' })).toBe(3.75);
|
||||||
expect(getCacheMultiplier({ valueKey: 'claude-3-5-sonnet', cacheType: 'read' })).toBe(0.3);
|
expect(getCacheMultiplier({ valueKey: 'claude-3-5-sonnet', cacheType: 'read' })).toBe(0.3);
|
||||||
|
expect(getCacheMultiplier({ valueKey: 'claude-3-5-haiku', cacheType: 'write' })).toBe(1.25);
|
||||||
|
expect(getCacheMultiplier({ valueKey: 'claude-3-5-haiku', cacheType: 'read' })).toBe(0.1);
|
||||||
expect(getCacheMultiplier({ valueKey: 'claude-3-haiku', cacheType: 'write' })).toBe(0.3);
|
expect(getCacheMultiplier({ valueKey: 'claude-3-haiku', cacheType: 'write' })).toBe(0.3);
|
||||||
expect(getCacheMultiplier({ valueKey: 'claude-3-haiku', cacheType: 'read' })).toBe(0.03);
|
expect(getCacheMultiplier({ valueKey: 'claude-3-haiku', cacheType: 'read' })).toBe(0.03);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,8 @@ const anthropicModels = {
|
||||||
'claude-3-haiku': 200000,
|
'claude-3-haiku': 200000,
|
||||||
'claude-3-sonnet': 200000,
|
'claude-3-sonnet': 200000,
|
||||||
'claude-3-opus': 200000,
|
'claude-3-opus': 200000,
|
||||||
|
'claude-3.5-haiku': 200000,
|
||||||
|
'claude-3-5-haiku': 200000,
|
||||||
'claude-3-5-sonnet': 200000,
|
'claude-3-5-sonnet': 200000,
|
||||||
'claude-3.5-sonnet': 200000,
|
'claude-3.5-sonnet': 200000,
|
||||||
'claude-3-5-sonnet-latest': 200000,
|
'claude-3-5-sonnet-latest': 200000,
|
||||||
|
|
|
||||||
|
|
@ -608,6 +608,7 @@ const sharedOpenAIModels = [
|
||||||
];
|
];
|
||||||
|
|
||||||
const sharedAnthropicModels = [
|
const sharedAnthropicModels = [
|
||||||
|
'claude-3-5-haiku-20241022',
|
||||||
'claude-3-5-sonnet-20241022',
|
'claude-3-5-sonnet-20241022',
|
||||||
'claude-3-5-sonnet-20240620',
|
'claude-3-5-sonnet-20240620',
|
||||||
'claude-3-5-sonnet-latest',
|
'claude-3-5-sonnet-latest',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue