mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
🤖 feat: Latest Grok Model Pricing & Context Rates (#10727)
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
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
* 🤖 feat: Latest Grok Model Pricing & Context Rates - Introduced 'grok-4-fast', 'grok-4-1-fast', and 'grok-code-fast' models with their respective prompt and completion rates. - Enhanced unit tests to validate prompt and completion rates for the new models, including variations with prefixes. - Updated token limits for the new models in the tokens utility, ensuring accurate handling in tests. * 🔧 refactor: Optimize JSON Export Logic in useExportConversation Hook Updated the export logic to create a Blob from the JSON string before downloading, improving compatibility and performance for file downloads. This change enhances the handling of deeply nested exports while maintaining the file size reduction achieved in previous updates.
This commit is contained in:
parent
2ccaf6be6d
commit
d7ce19e15a
5 changed files with 103 additions and 1 deletions
|
|
@ -173,6 +173,9 @@ const tokenValues = Object.assign(
|
||||||
'grok-3-mini': { prompt: 0.3, completion: 0.5 },
|
'grok-3-mini': { prompt: 0.3, completion: 0.5 },
|
||||||
'grok-3-mini-fast': { prompt: 0.6, completion: 4 },
|
'grok-3-mini-fast': { prompt: 0.6, completion: 4 },
|
||||||
'grok-4': { prompt: 3.0, completion: 15.0 },
|
'grok-4': { prompt: 3.0, completion: 15.0 },
|
||||||
|
'grok-4-fast': { prompt: 0.2, completion: 0.5 },
|
||||||
|
'grok-4-1-fast': { prompt: 0.2, completion: 0.5 }, // covers reasoning & non-reasoning variants
|
||||||
|
'grok-code-fast': { prompt: 0.2, completion: 1.5 },
|
||||||
codestral: { prompt: 0.3, completion: 0.9 },
|
codestral: { prompt: 0.3, completion: 0.9 },
|
||||||
'ministral-3b': { prompt: 0.04, completion: 0.04 },
|
'ministral-3b': { prompt: 0.04, completion: 0.04 },
|
||||||
'ministral-8b': { prompt: 0.1, completion: 0.1 },
|
'ministral-8b': { prompt: 0.1, completion: 0.1 },
|
||||||
|
|
|
||||||
|
|
@ -1205,6 +1205,39 @@ describe('Grok Model Tests - Pricing', () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should return correct prompt and completion rates for Grok 4 Fast model', () => {
|
||||||
|
expect(getMultiplier({ model: 'grok-4-fast', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-4-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'grok-4-fast', tokenType: 'completion' })).toBe(
|
||||||
|
tokenValues['grok-4-fast'].completion,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct prompt and completion rates for Grok 4.1 Fast models', () => {
|
||||||
|
expect(getMultiplier({ model: 'grok-4-1-fast-reasoning', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-4-1-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'grok-4-1-fast-reasoning', tokenType: 'completion' })).toBe(
|
||||||
|
tokenValues['grok-4-1-fast'].completion,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'grok-4-1-fast-non-reasoning', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-4-1-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'grok-4-1-fast-non-reasoning', tokenType: 'completion' })).toBe(
|
||||||
|
tokenValues['grok-4-1-fast'].completion,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct prompt and completion rates for Grok Code Fast model', () => {
|
||||||
|
expect(getMultiplier({ model: 'grok-code-fast-1', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-code-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'grok-code-fast-1', tokenType: 'completion' })).toBe(
|
||||||
|
tokenValues['grok-code-fast'].completion,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test('should return correct prompt and completion rates for Grok 3 models with prefixes', () => {
|
test('should return correct prompt and completion rates for Grok 3 models with prefixes', () => {
|
||||||
expect(getMultiplier({ model: 'xai/grok-3', tokenType: 'prompt' })).toBe(
|
expect(getMultiplier({ model: 'xai/grok-3', tokenType: 'prompt' })).toBe(
|
||||||
tokenValues['grok-3'].prompt,
|
tokenValues['grok-3'].prompt,
|
||||||
|
|
@ -1240,6 +1273,39 @@ describe('Grok Model Tests - Pricing', () => {
|
||||||
tokenValues['grok-4'].completion,
|
tokenValues['grok-4'].completion,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should return correct prompt and completion rates for Grok 4 Fast model with prefixes', () => {
|
||||||
|
expect(getMultiplier({ model: 'xai/grok-4-fast', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-4-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'xai/grok-4-fast', tokenType: 'completion' })).toBe(
|
||||||
|
tokenValues['grok-4-fast'].completion,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct prompt and completion rates for Grok 4.1 Fast models with prefixes', () => {
|
||||||
|
expect(getMultiplier({ model: 'xai/grok-4-1-fast-reasoning', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-4-1-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'xai/grok-4-1-fast-reasoning', tokenType: 'completion' })).toBe(
|
||||||
|
tokenValues['grok-4-1-fast'].completion,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'xai/grok-4-1-fast-non-reasoning', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-4-1-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
getMultiplier({ model: 'xai/grok-4-1-fast-non-reasoning', tokenType: 'completion' }),
|
||||||
|
).toBe(tokenValues['grok-4-1-fast'].completion);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct prompt and completion rates for Grok Code Fast model with prefixes', () => {
|
||||||
|
expect(getMultiplier({ model: 'xai/grok-code-fast-1', tokenType: 'prompt' })).toBe(
|
||||||
|
tokenValues['grok-code-fast'].prompt,
|
||||||
|
);
|
||||||
|
expect(getMultiplier({ model: 'xai/grok-code-fast-1', tokenType: 'completion' })).toBe(
|
||||||
|
tokenValues['grok-code-fast'].completion,
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -778,6 +778,16 @@ describe('Grok Model Tests - Tokens', () => {
|
||||||
expect(getModelMaxTokens('grok-4-0709')).toBe(256000);
|
expect(getModelMaxTokens('grok-4-0709')).toBe(256000);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should return correct tokens for Grok 4 Fast and Grok 4.1 Fast models', () => {
|
||||||
|
expect(getModelMaxTokens('grok-4-fast')).toBe(2000000);
|
||||||
|
expect(getModelMaxTokens('grok-4-1-fast-reasoning')).toBe(2000000);
|
||||||
|
expect(getModelMaxTokens('grok-4-1-fast-non-reasoning')).toBe(2000000);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct tokens for Grok Code Fast model', () => {
|
||||||
|
expect(getModelMaxTokens('grok-code-fast-1')).toBe(256000);
|
||||||
|
});
|
||||||
|
|
||||||
test('should handle partial matches for Grok models with prefixes', () => {
|
test('should handle partial matches for Grok models with prefixes', () => {
|
||||||
// Vision models should match before general models
|
// Vision models should match before general models
|
||||||
expect(getModelMaxTokens('xai/grok-2-vision-1212')).toBe(32768);
|
expect(getModelMaxTokens('xai/grok-2-vision-1212')).toBe(32768);
|
||||||
|
|
@ -797,6 +807,12 @@ describe('Grok Model Tests - Tokens', () => {
|
||||||
expect(getModelMaxTokens('xai/grok-3-mini-fast')).toBe(131072);
|
expect(getModelMaxTokens('xai/grok-3-mini-fast')).toBe(131072);
|
||||||
// Grok 4 model
|
// Grok 4 model
|
||||||
expect(getModelMaxTokens('xai/grok-4-0709')).toBe(256000);
|
expect(getModelMaxTokens('xai/grok-4-0709')).toBe(256000);
|
||||||
|
// Grok 4 Fast and 4.1 Fast models
|
||||||
|
expect(getModelMaxTokens('xai/grok-4-fast')).toBe(2000000);
|
||||||
|
expect(getModelMaxTokens('xai/grok-4-1-fast-reasoning')).toBe(2000000);
|
||||||
|
expect(getModelMaxTokens('xai/grok-4-1-fast-non-reasoning')).toBe(2000000);
|
||||||
|
// Grok Code Fast model
|
||||||
|
expect(getModelMaxTokens('xai/grok-code-fast-1')).toBe(256000);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -820,6 +836,12 @@ describe('Grok Model Tests - Tokens', () => {
|
||||||
expect(matchModelName('grok-3-mini-fast')).toBe('grok-3-mini-fast');
|
expect(matchModelName('grok-3-mini-fast')).toBe('grok-3-mini-fast');
|
||||||
// Grok 4 model
|
// Grok 4 model
|
||||||
expect(matchModelName('grok-4-0709')).toBe('grok-4');
|
expect(matchModelName('grok-4-0709')).toBe('grok-4');
|
||||||
|
// Grok 4 Fast and 4.1 Fast models
|
||||||
|
expect(matchModelName('grok-4-fast')).toBe('grok-4-fast');
|
||||||
|
expect(matchModelName('grok-4-1-fast-reasoning')).toBe('grok-4-1-fast');
|
||||||
|
expect(matchModelName('grok-4-1-fast-non-reasoning')).toBe('grok-4-1-fast');
|
||||||
|
// Grok Code Fast model
|
||||||
|
expect(matchModelName('grok-code-fast-1')).toBe('grok-code-fast');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should match Grok model variations with prefixes', () => {
|
test('should match Grok model variations with prefixes', () => {
|
||||||
|
|
@ -841,6 +863,12 @@ describe('Grok Model Tests - Tokens', () => {
|
||||||
expect(matchModelName('xai/grok-3-mini-fast')).toBe('grok-3-mini-fast');
|
expect(matchModelName('xai/grok-3-mini-fast')).toBe('grok-3-mini-fast');
|
||||||
// Grok 4 model
|
// Grok 4 model
|
||||||
expect(matchModelName('xai/grok-4-0709')).toBe('grok-4');
|
expect(matchModelName('xai/grok-4-0709')).toBe('grok-4');
|
||||||
|
// Grok 4 Fast and 4.1 Fast models
|
||||||
|
expect(matchModelName('xai/grok-4-fast')).toBe('grok-4-fast');
|
||||||
|
expect(matchModelName('xai/grok-4-1-fast-reasoning')).toBe('grok-4-1-fast');
|
||||||
|
expect(matchModelName('xai/grok-4-1-fast-non-reasoning')).toBe('grok-4-1-fast');
|
||||||
|
// Grok Code Fast model
|
||||||
|
expect(matchModelName('xai/grok-code-fast-1')).toBe('grok-code-fast');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -366,7 +366,9 @@ export default function useExportConversation({
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Use JSON.stringify without indentation to minimize file size for deeply nested recursive exports */
|
/** Use JSON.stringify without indentation to minimize file size for deeply nested recursive exports */
|
||||||
download(JSON.stringify(data), `${filename}.json`, 'application/json');
|
const jsonString = JSON.stringify(data);
|
||||||
|
const blob = new Blob([jsonString], { type: 'application/json;charset=utf-8' });
|
||||||
|
download(blob, `${filename}.json`, 'application/json');
|
||||||
};
|
};
|
||||||
|
|
||||||
const exportConversation = () => {
|
const exportConversation = () => {
|
||||||
|
|
|
||||||
|
|
@ -280,6 +280,9 @@ const xAIModels = {
|
||||||
'grok-3-mini': 131072,
|
'grok-3-mini': 131072,
|
||||||
'grok-3-mini-fast': 131072,
|
'grok-3-mini-fast': 131072,
|
||||||
'grok-4': 256000, // 256K context
|
'grok-4': 256000, // 256K context
|
||||||
|
'grok-4-fast': 2000000, // 2M context
|
||||||
|
'grok-4-1-fast': 2000000, // 2M context (covers reasoning & non-reasoning variants)
|
||||||
|
'grok-code-fast': 256000, // 256K context
|
||||||
};
|
};
|
||||||
|
|
||||||
const aggregateModels = {
|
const aggregateModels = {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue