mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-15 02:16:27 +00:00
feat(catalog): add Claude Opus 4.8 to Anthropic model registry
Register `claude-opus-4-8` in the cliproxy model catalog, web-server pricing table, and UI catalog as an additive entry next to 4.7. Defaults are unchanged (claude provider stays on sonnet-4-6); users opt into 4.8 explicitly via ANTHROPIC_MODEL or the dashboard. Configuration mirrors 4.7: - adaptive thinking levels (low through max), max distinct from xhigh - extendedContext (1M) available - nativeImageInput - pricing $5/$25 in/out, $6.25/$0.5 cache Built [OnSteroids](https://onsteroids.ai)
This commit is contained in:
1 parent
5b8923c85e
commit
357ce8b07a
7 files changed
+92
-17
No files matched your search
@@ -168,6 +168,14 @@ describe('model-pricing', () => {
|
||||
expect(opus47dated.outputPerMillion).toBe(25.0);
|
||||
});
|
||||
|
||||
it('should return correct pricing for Claude Opus 4.8', () => {
|
||||
const opus48 = getModelPricing('claude-opus-4-8');
|
||||
expect(opus48.inputPerMillion).toBe(5.0);
|
||||
expect(opus48.outputPerMillion).toBe(25.0);
|
||||
expect(opus48.cacheCreationPerMillion).toBe(6.25);
|
||||
expect(opus48.cacheReadPerMillion).toBe(0.5);
|
||||
});
|
||||
|
||||
it('should not map unknown future model families onto known family pricing', () => {
|
||||
const fallback = getModelPricing('unknown-model-xyz');
|
||||
|
||||
@@ -266,6 +274,17 @@ describe('model-pricing', () => {
|
||||
const cost = calculateCost(usage, 'claude-opus-4-7');
|
||||
expect(cost).toBe(36.75); // 5 + 25 + 6.25 + 0.5
|
||||
});
|
||||
|
||||
it('should calculate Claude Opus 4.8 cost including cache token rates', () => {
|
||||
const usage: TokenUsage = {
|
||||
inputTokens: 1_000_000,
|
||||
outputTokens: 1_000_000,
|
||||
cacheCreationTokens: 1_000_000,
|
||||
cacheReadTokens: 1_000_000,
|
||||
};
|
||||
const cost = calculateCost(usage, 'claude-opus-4-8');
|
||||
expect(cost).toBe(36.75); // 5 + 25 + 6.25 + 0.5
|
||||
});
|
||||
});
|
||||
|
||||
describe('getKnownModels', () => {
|
||||
@@ -469,17 +488,15 @@ describe('model-pricing', () => {
|
||||
});
|
||||
|
||||
it('gracefully ignores malformed cached model entries', () => {
|
||||
setCachedModelsDevRegistry(
|
||||
{
|
||||
openai: {
|
||||
id: 'openai',
|
||||
models: {
|
||||
'null-entry': null,
|
||||
'gpt-5.5': { id: 'gpt-5.5', cost: { input: 5, output: 30 } },
|
||||
},
|
||||
setCachedModelsDevRegistry({
|
||||
openai: {
|
||||
id: 'openai',
|
||||
models: {
|
||||
'null-entry': null,
|
||||
'gpt-5.5': { id: 'gpt-5.5', cost: { input: 5, output: 30 } },
|
||||
},
|
||||
} as unknown as Parameters<typeof setCachedModelsDevRegistry>[0]
|
||||
);
|
||||
},
|
||||
} as unknown as Parameters<typeof setCachedModelsDevRegistry>[0]);
|
||||
|
||||
expect(() => getModelPricing('openai/gpt-5.5')).not.toThrow();
|
||||
expect(getModelPricing('openai/gpt-5.5').inputPerMillion).toBe(5);
|
||||
|
||||
Reference in new issue
Block a user