|
@@ -7,41 +7,41 @@ export {} // This makes the file a proper TypeScript module
|
|
|
describe("ContextWindowProgress Logic", () => {
|
|
describe("ContextWindowProgress Logic", () => {
|
|
|
// Using the shared utility function from model-utils.ts instead of reimplementing it
|
|
// Using the shared utility function from model-utils.ts instead of reimplementing it
|
|
|
|
|
|
|
|
- test("calculates correct token distribution with default 20% reservation", () => {
|
|
|
|
|
- const contextWindow = 4000
|
|
|
|
|
|
|
+ test("calculates correct token distribution with default 8192 reservation", () => {
|
|
|
|
|
+ const contextWindow = 10000
|
|
|
const contextTokens = 1000
|
|
const contextTokens = 1000
|
|
|
|
|
|
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
|
|
|
|
|
|
// Expected calculations:
|
|
// Expected calculations:
|
|
|
- // reservedForOutput = 0.2 * 4000 = 800
|
|
|
|
|
- // availableSize = 4000 - 1000 - 800 = 2200
|
|
|
|
|
- // total = 1000 + 800 + 2200 = 4000
|
|
|
|
|
- expect(result.reservedForOutput).toBe(800)
|
|
|
|
|
- expect(result.availableSize).toBe(2200)
|
|
|
|
|
|
|
+ // reservedForOutput = 8192 (ANTHROPIC_DEFAULT_MAX_TOKENS)
|
|
|
|
|
+ // availableSize = 10000 - 1000 - 8192 = 808
|
|
|
|
|
+ // total = 1000 + 8192 + 808 = 10000
|
|
|
|
|
+ expect(result.reservedForOutput).toBe(8192)
|
|
|
|
|
+ expect(result.availableSize).toBe(808)
|
|
|
|
|
|
|
|
// Check percentages
|
|
// Check percentages
|
|
|
- expect(result.currentPercent).toBeCloseTo(25) // 1000/4000 * 100 = 25%
|
|
|
|
|
- expect(result.reservedPercent).toBeCloseTo(20) // 800/4000 * 100 = 20%
|
|
|
|
|
- expect(result.availablePercent).toBeCloseTo(55) // 2200/4000 * 100 = 55%
|
|
|
|
|
|
|
+ expect(result.currentPercent).toBeCloseTo(10) // 1000/10000 * 100 = 10%
|
|
|
|
|
+ expect(result.reservedPercent).toBeCloseTo(81.92) // 8192/10000 * 100 = 81.92%
|
|
|
|
|
+ expect(result.availablePercent).toBeCloseTo(8.08) // 808/10000 * 100 = 8.08%
|
|
|
|
|
|
|
|
// Verify percentages sum to 100%
|
|
// Verify percentages sum to 100%
|
|
|
expect(result.currentPercent + result.reservedPercent + result.availablePercent).toBeCloseTo(100)
|
|
expect(result.currentPercent + result.reservedPercent + result.availablePercent).toBeCloseTo(100)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
test("uses provided maxTokens when available instead of default calculation", () => {
|
|
test("uses provided maxTokens when available instead of default calculation", () => {
|
|
|
- const contextWindow = 4000
|
|
|
|
|
|
|
+ const contextWindow = 10000
|
|
|
const contextTokens = 1000
|
|
const contextTokens = 1000
|
|
|
|
|
|
|
|
- // First calculate with default 20% reservation (no maxTokens provided)
|
|
|
|
|
|
|
+ // First calculate with default 8192 reservation (no maxTokens provided)
|
|
|
const defaultResult = calculateTokenDistribution(contextWindow, contextTokens)
|
|
const defaultResult = calculateTokenDistribution(contextWindow, contextTokens)
|
|
|
|
|
|
|
|
// Then calculate with custom maxTokens value
|
|
// Then calculate with custom maxTokens value
|
|
|
- const customMaxTokens = 1500 // Custom maxTokens instead of default 20%
|
|
|
|
|
|
|
+ const customMaxTokens = 1500 // Custom maxTokens instead of default 8192
|
|
|
const customResult = calculateTokenDistribution(contextWindow, contextTokens, customMaxTokens)
|
|
const customResult = calculateTokenDistribution(contextWindow, contextTokens, customMaxTokens)
|
|
|
|
|
|
|
|
- // VERIFY MAXTOKEN PROP EFFECT: Custom maxTokens should be used directly instead of 20% calculation
|
|
|
|
|
- const defaultReserved = Math.ceil(contextWindow * 0.2) // 800 tokens (20% of 4000)
|
|
|
|
|
|
|
+ // VERIFY MAXTOKEN PROP EFFECT: Custom maxTokens should be used directly instead of 8192 calculation
|
|
|
|
|
+ const defaultReserved = 8192 // ANTHROPIC_DEFAULT_MAX_TOKENS
|
|
|
expect(defaultResult.reservedForOutput).toBe(defaultReserved)
|
|
expect(defaultResult.reservedForOutput).toBe(defaultReserved)
|
|
|
expect(customResult.reservedForOutput).toBe(customMaxTokens) // Should use exact provided value
|
|
expect(customResult.reservedForOutput).toBe(customMaxTokens) // Should use exact provided value
|
|
|
|
|
|
|
@@ -51,13 +51,13 @@ describe("ContextWindowProgress Logic", () => {
|
|
|
expect(defaultTooltip).not.toBe(customTooltip)
|
|
expect(defaultTooltip).not.toBe(customTooltip)
|
|
|
|
|
|
|
|
// Verify the effect on available space
|
|
// Verify the effect on available space
|
|
|
- expect(customResult.availableSize).toBe(4000 - 1000 - 1500) // 1500 tokens available
|
|
|
|
|
- expect(defaultResult.availableSize).toBe(4000 - 1000 - 800) // 2200 tokens available
|
|
|
|
|
|
|
+ expect(customResult.availableSize).toBe(10000 - 1000 - 1500) // 7500 tokens available
|
|
|
|
|
+ expect(defaultResult.availableSize).toBe(10000 - 1000 - 8192) // 808 tokens available
|
|
|
|
|
|
|
|
// Verify the effect on percentages
|
|
// Verify the effect on percentages
|
|
|
- // With custom maxTokens (1500), the reserved percentage should be higher
|
|
|
|
|
- expect(defaultResult.reservedPercent).toBeCloseTo(20) // 800/4000 * 100 = 20%
|
|
|
|
|
- expect(customResult.reservedPercent).toBeCloseTo(37.5) // 1500/4000 * 100 = 37.5%
|
|
|
|
|
|
|
+ // With custom maxTokens (1500), the reserved percentage should be lower than default
|
|
|
|
|
+ expect(defaultResult.reservedPercent).toBeCloseTo(81.92) // 8192/10000 * 100 = 81.92%
|
|
|
|
|
+ expect(customResult.reservedPercent).toBeCloseTo(15) // 1500/10000 * 100 = 15%
|
|
|
|
|
|
|
|
// Verify percentages still sum to 100%
|
|
// Verify percentages still sum to 100%
|
|
|
expect(customResult.currentPercent + customResult.reservedPercent + customResult.availablePercent).toBeCloseTo(
|
|
expect(customResult.currentPercent + customResult.reservedPercent + customResult.availablePercent).toBeCloseTo(
|
|
@@ -66,19 +66,19 @@ describe("ContextWindowProgress Logic", () => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
test("handles negative input values", () => {
|
|
test("handles negative input values", () => {
|
|
|
- const contextWindow = 4000
|
|
|
|
|
|
|
+ const contextWindow = 10000
|
|
|
const contextTokens = -500 // Negative tokens should be handled gracefully
|
|
const contextTokens = -500 // Negative tokens should be handled gracefully
|
|
|
|
|
|
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
|
|
|
|
|
|
// Expected calculations:
|
|
// Expected calculations:
|
|
|
// safeContextTokens = Math.max(0, -500) = 0
|
|
// safeContextTokens = Math.max(0, -500) = 0
|
|
|
- // reservedForOutput = 0.2 * 4000 = 800
|
|
|
|
|
- // availableSize = 4000 - 0 - 800 = 3200
|
|
|
|
|
- // total = 0 + 800 + 3200 = 4000
|
|
|
|
|
- expect(result.currentPercent).toBeCloseTo(0) // 0/4000 * 100 = 0%
|
|
|
|
|
- expect(result.reservedPercent).toBeCloseTo(20) // 800/4000 * 100 = 20%
|
|
|
|
|
- expect(result.availablePercent).toBeCloseTo(80) // 3200/4000 * 100 = 80%
|
|
|
|
|
|
|
+ // reservedForOutput = 8192 (ANTHROPIC_DEFAULT_MAX_TOKENS)
|
|
|
|
|
+ // availableSize = 10000 - 0 - 8192 = 1808
|
|
|
|
|
+ // total = 0 + 8192 + 1808 = 10000
|
|
|
|
|
+ expect(result.currentPercent).toBeCloseTo(0) // 0/10000 * 100 = 0%
|
|
|
|
|
+ expect(result.reservedPercent).toBeCloseTo(81.92) // 8192/10000 * 100 = 81.92%
|
|
|
|
|
+ expect(result.availablePercent).toBeCloseTo(18.08) // 1808/10000 * 100 = 18.08%
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
test("handles zero context window gracefully", () => {
|
|
test("handles zero context window gracefully", () => {
|
|
@@ -87,9 +87,9 @@ describe("ContextWindowProgress Logic", () => {
|
|
|
|
|
|
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
|
|
|
|
|
|
- // With zero context window, everything should be zero
|
|
|
|
|
- expect(result.reservedForOutput).toBe(0)
|
|
|
|
|
- expect(result.availableSize).toBe(0)
|
|
|
|
|
|
|
+ // With zero context window, the function uses ANTHROPIC_DEFAULT_MAX_TOKENS but available size becomes 0
|
|
|
|
|
+ expect(result.reservedForOutput).toBe(8192) // ANTHROPIC_DEFAULT_MAX_TOKENS
|
|
|
|
|
+ expect(result.availableSize).toBe(0) // max(0, 0 - 1000 - 8192) = 0
|
|
|
|
|
|
|
|
// The percentages maintain total of 100% even with zero context window
|
|
// The percentages maintain total of 100% even with zero context window
|
|
|
// due to how the division handles this edge case
|
|
// due to how the division handles this edge case
|
|
@@ -98,20 +98,20 @@ describe("ContextWindowProgress Logic", () => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
test("handles case where tokens exceed context window", () => {
|
|
test("handles case where tokens exceed context window", () => {
|
|
|
- const contextWindow = 4000
|
|
|
|
|
- const contextTokens = 5000 // More tokens than the window size
|
|
|
|
|
|
|
+ const contextWindow = 10000
|
|
|
|
|
+ const contextTokens = 12000 // More tokens than the window size
|
|
|
|
|
|
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
const result = calculateTokenDistribution(contextWindow, contextTokens)
|
|
|
|
|
|
|
|
// Expected calculations:
|
|
// Expected calculations:
|
|
|
- // reservedForOutput = 0.2 * 4000 = 800
|
|
|
|
|
- // availableSize = Math.max(0, 4000 - 5000 - 800) = 0
|
|
|
|
|
- expect(result.reservedForOutput).toBe(800)
|
|
|
|
|
|
|
+ // reservedForOutput = 8192 (ANTHROPIC_DEFAULT_MAX_TOKENS)
|
|
|
|
|
+ // availableSize = Math.max(0, 10000 - 12000 - 8192) = 0
|
|
|
|
|
+ expect(result.reservedForOutput).toBe(8192)
|
|
|
expect(result.availableSize).toBe(0)
|
|
expect(result.availableSize).toBe(0)
|
|
|
|
|
|
|
|
- // Percentages should be calculated based on total (5000 + 800 + 0 = 5800)
|
|
|
|
|
- expect(result.currentPercent).toBeCloseTo((5000 / 5800) * 100)
|
|
|
|
|
- expect(result.reservedPercent).toBeCloseTo((800 / 5800) * 100)
|
|
|
|
|
|
|
+ // Percentages should be calculated based on total (12000 + 8192 + 0 = 20192)
|
|
|
|
|
+ expect(result.currentPercent).toBeCloseTo((12000 / 20192) * 100)
|
|
|
|
|
+ expect(result.reservedPercent).toBeCloseTo((8192 / 20192) * 100)
|
|
|
expect(result.availablePercent).toBeCloseTo(0)
|
|
expect(result.availablePercent).toBeCloseTo(0)
|
|
|
|
|
|
|
|
// Verify percentages sum to 100%
|
|
// Verify percentages sum to 100%
|