Skip to content

Commit 82e2340

Browse files
authored
fix: strenghen NEP trigger conditions (#2438)
## Problem Bring the code we removed previously back https://github.com/aws/language-servers/pull/2424/files#diff-10a12088df160c3eec8bb5eedd826e4ee475614c9b3a544fa2393cdeed92bc24L231-L238 and make the trigger criteria more strict. 1. Non empty right context starting next line 2. Recent edits in the past 20 seconds 3. Classifier result is greater than the threshold ## Solution <!--- REMINDER: - Read CONTRIBUTING.md first. - Add test coverage for your changes. - Link to related issues/commits. - Testing: how did you test your changes? - Screenshots if applicable --> ## License By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent d030288 commit 82e2340

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

server/aws-lsp-codewhisperer/src/language-server/inline-completion/auto-trigger/editPredictionAutoTrigger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ export class EditClassifier {
221221
this.features = this.prepareFeatures(params)
222222
}
223223

224-
shouldTriggerNep(): { shouldTrigger: boolean; threshold: number; score: number } {
224+
shouldTriggerEdits(): { shouldTrigger: boolean; threshold: number; score: number } {
225225
const s = this.score()
226226
return {
227227
score: s,

server/aws-lsp-codewhisperer/src/language-server/inline-completion/handler/editCompletionHandler.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ describe('EditCompletionHandler', () => {
345345

346346
function aTriggerStub(flag: boolean): EditAutotrigger.EditClassifier {
347347
return {
348-
shouldTriggerNep: sinon
348+
shouldTriggerEdits: sinon
349349
.stub()
350350
.returns({ score: 0, threshold: EditAutotrigger.EditClassifier.THRESHOLD, shouldTrigger: flag }),
351351
} as any as EditAutotrigger.EditClassifier
@@ -354,6 +354,9 @@ describe('EditCompletionHandler', () => {
354354
it('should return empty result when shouldTriggerEdits returns false', async () => {
355355
workspace.getWorkspaceFolder.returns(undefined)
356356

357+
const shouldTriggerEditsStub = sinon
358+
.stub(require('../utils/triggerUtils'), 'shouldTriggerEdits')
359+
.returns(false)
357360
sinon.stub(EditAutotrigger, 'EditClassifier').returns(aTriggerStub(false))
358361

359362
const result = await handler._invoke(
@@ -366,12 +369,16 @@ describe('EditCompletionHandler', () => {
366369
)
367370

368371
assert.deepEqual(result, EMPTY_RESULT)
372+
shouldTriggerEditsStub.restore()
369373
})
370374

371375
it('should create session and call generateSuggestions when trigger is valid', async () => {
372376
workspace.getWorkspaceFolder.returns(undefined)
373377

374378
sinon.stub(EditAutotrigger, 'EditClassifier').returns(aTriggerStub(true))
379+
const shouldTriggerEditsStub = sinon
380+
.stub(require('../utils/triggerUtils'), 'shouldTriggerEdits')
381+
.returns(true)
375382
codeWhispererService.constructSupplementalContext.resolves(null)
376383
codeWhispererService.generateSuggestions.resolves({
377384
suggestions: [{ itemId: 'item-1', content: 'test content' }],
@@ -389,6 +396,8 @@ describe('EditCompletionHandler', () => {
389396

390397
assert.strictEqual(result.items.length, 1)
391398
sinon.assert.called(codeWhispererService.generateSuggestions)
399+
400+
shouldTriggerEditsStub.restore()
392401
})
393402

394403
it('should handle active session and emit telemetry', async () => {
@@ -399,6 +408,9 @@ describe('EditCompletionHandler', () => {
399408
if (currentSession) {
400409
sessionManager.activateSession(currentSession)
401410
}
411+
const shouldTriggerEditsStub = sinon
412+
.stub(require('../utils/triggerUtils'), 'shouldTriggerEdits')
413+
.returns(true)
402414
sinon.stub(EditAutotrigger, 'EditClassifier').returns(aTriggerStub(true))
403415
codeWhispererService.constructSupplementalContext.resolves(null)
404416
codeWhispererService.generateSuggestions.resolves({
@@ -416,11 +428,16 @@ describe('EditCompletionHandler', () => {
416428
)
417429

418430
assert.strictEqual(currentSession?.state, 'DISCARD')
431+
432+
shouldTriggerEditsStub.restore()
419433
})
420434

421435
it('should handle supplemental context when available', async () => {
422436
workspace.getWorkspaceFolder.returns(undefined)
423437

438+
const shouldTriggerEditsStub = sinon
439+
.stub(require('../utils/triggerUtils'), 'shouldTriggerEdits')
440+
.returns(true)
424441
sinon.stub(EditAutotrigger, 'EditClassifier').returns(aTriggerStub(true))
425442
codeWhispererService.constructSupplementalContext.resolves({
426443
items: [{ content: 'context', filePath: 'file.ts' }],
@@ -441,6 +458,8 @@ describe('EditCompletionHandler', () => {
441458
)
442459

443460
sinon.assert.calledWith(codeWhispererService.generateSuggestions, sinon.match.has('supplementalContexts'))
461+
462+
shouldTriggerEditsStub.restore()
444463
})
445464
})
446465

server/aws-lsp-codewhisperer/src/language-server/inline-completion/handler/editCompletionHandler.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { CodeWhispererSession, SessionManager } from '../session/sessionManager'
2222
import { CursorTracker } from '../tracker/cursorTracker'
2323
import { CodewhispererLanguage, getSupportedLanguageId } from '../../../shared/languageDetection'
2424
import { WorkspaceFolderManager } from '../../workspaceContext/workspaceFolderManager'
25-
import { inferTriggerChar } from '../utils/triggerUtils'
25+
import { inferTriggerChar, shouldTriggerEdits } from '../utils/triggerUtils'
2626
import {
2727
emitEmptyUserTriggerDecisionTelemetry,
2828
emitServiceInvocationFailure,
@@ -212,6 +212,8 @@ export class EditCompletionHandler {
212212
const workspaceId = workspaceState?.webSocketClient?.isConnected() ? workspaceState.workspaceId : undefined
213213

214214
const recentEdits = await this.recentEditsTracker.generateEditBasedContext(textDocument)
215+
216+
// TODO: Refactor and merge these 2 shouldTrigger into single one
215217
const classifier = new EditClassifier(
216218
{
217219
fileContext: fileContextClss,
@@ -221,10 +223,22 @@ export class EditCompletionHandler {
221223
},
222224
this.logging
223225
)
226+
const classifierBasedTrigger = classifier.shouldTriggerEdits()
227+
228+
const ruleBasedTrigger = shouldTriggerEdits(
229+
this.codeWhispererService,
230+
fileContextClss.toServiceModel(),
231+
params,
232+
this.cursorTracker,
233+
this.recentEditsTracker,
234+
this.sessionManager,
235+
true
236+
)
224237

225-
const qEditsTrigger = classifier.shouldTriggerNep()
238+
// Both classifier and rule based conditions need to evaluate to true otherwise we wont fire Edits requests
239+
const shouldFire = classifierBasedTrigger.shouldTrigger && ruleBasedTrigger !== undefined
226240

227-
if (!qEditsTrigger.shouldTrigger) {
241+
if (!shouldFire) {
228242
return EMPTY_RESULT
229243
}
230244

0 commit comments

Comments
 (0)