Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions src/api/providers/__tests__/bedrock.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,80 @@ describe("AwsBedrockHandler", () => {
expect(result.crossRegionInference).toBe(false)
expect(result.modelId).toBe("ap.anthropic.claude-3-5-sonnet-20241022-v2:0") // Should be preserved as-is
})

it("should respect 1M context window in auto-condensing threshold calculations", () => {
// Test case 1: Without 1M context enabled
const handlerWithout1M = new AwsBedrockHandler({
apiModelId: BEDROCK_1M_CONTEXT_MODEL_IDS[0],
awsAccessKey: "test",
awsSecretKey: "test",
awsRegion: "us-east-1",
awsBedrock1MContext: false,
})

const modelWithout1M = handlerWithout1M.getModel()

// Should use default 200K context window
expect(modelWithout1M.info.contextWindow).toBe(200_000)

// With 100K tokens and 100% threshold, should trigger at 200K (100% of 200K)
const contextPercentWithout1M = (100 * 100_000) / modelWithout1M.info.contextWindow
expect(contextPercentWithout1M).toBe(50) // 100K is 50% of 200K

// Test case 2: With 1M context enabled
const handlerWith1M = new AwsBedrockHandler({
apiModelId: BEDROCK_1M_CONTEXT_MODEL_IDS[0],
awsAccessKey: "test",
awsSecretKey: "test",
awsRegion: "us-east-1",
awsBedrock1MContext: true,
})

const modelWith1M = handlerWith1M.getModel()

// Should use 1M context window
expect(modelWith1M.info.contextWindow).toBe(1_000_000)

// With 100K tokens and 100% threshold, should trigger at 1M (100% of 1M)
const contextPercentWith1M = (100 * 100_000) / modelWith1M.info.contextWindow
expect(contextPercentWith1M).toBe(10) // 100K is 10% of 1M

// Verify that auto-condensing would NOT trigger at 100K tokens with 100% threshold
// when 1M context is enabled (since 100K is only 10% of 1M)
const autoCondenseThreshold = 100 // 100% threshold
expect(contextPercentWith1M < autoCondenseThreshold).toBe(true)

// But it WOULD trigger without 1M context at 50% threshold
const lowerThreshold = 50
expect(contextPercentWithout1M >= lowerThreshold).toBe(true)
})

it("should maintain 1M context window across API handler rebuilds", () => {
// This test ensures that when the API handler is rebuilt or accessed multiple times,
// the 1M context window setting is consistently applied

const handler = new AwsBedrockHandler({
apiModelId: BEDROCK_1M_CONTEXT_MODEL_IDS[0],
awsAccessKey: "test",
awsSecretKey: "test",
awsRegion: "us-east-1",
awsBedrock1MContext: true,
})

// Get model info multiple times to simulate what happens in Task.ts
const model1 = handler.getModel()
const model2 = handler.getModel()
const model3 = handler.getModel()

// All should consistently return 1M context window
expect(model1.info.contextWindow).toBe(1_000_000)
expect(model2.info.contextWindow).toBe(1_000_000)
expect(model3.info.contextWindow).toBe(1_000_000)

// Verify the model ID remains consistent
expect(model1.id).toBe(model2.id)
expect(model2.id).toBe(model3.id)
})
})
Comment on lines +363 to 436
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests about 1M context window calculations are placed in the "ARN parsing with inference profiles" describe block, but they should be moved to the existing "1M context beta feature" describe block (line 649) since they test the 1M context feature rather than ARN parsing. This would improve test organization and make these tests easier to find and maintain alongside the other 1M context tests.

Fix it with Roo Code or mention @roomote and request a fix.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mrubens @hannesrudolph @ronyblum this implementation looks correct to me

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me

})

Expand Down
14 changes: 10 additions & 4 deletions src/core/task/Task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3342,10 +3342,13 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
const { profileThresholds = {} } = state ?? {}

const { contextTokens } = this.getTokenUsage()
const modelInfo = this.api.getModel().info
// Get the current model info from the API handler to ensure we have the correct context window
// This is important for Bedrock models with 1M context enabled
const currentModel = this.api.getModel()
const modelInfo = currentModel.info

const maxTokens = getModelMaxOutputTokens({
modelId: this.api.getModel().id,
modelId: currentModel.id,
model: modelInfo,
settings: this.apiConfiguration,
})
Expand Down Expand Up @@ -3487,10 +3490,13 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
const { contextTokens } = this.getTokenUsage()

if (contextTokens) {
const modelInfo = this.api.getModel().info
// Get the current model info from the API handler to ensure we have the correct context window
// This is important for Bedrock models with 1M context enabled
const currentModel = this.api.getModel()
const modelInfo = currentModel.info

const maxTokens = getModelMaxOutputTokens({
modelId: this.api.getModel().id,
modelId: currentModel.id,
model: modelInfo,
settings: this.apiConfiguration,
})
Expand Down
Loading