diff --git a/editors/vscode/package.json b/editors/vscode/package.json index a75d4d9..0e75093 100644 --- a/editors/vscode/package.json +++ b/editors/vscode/package.json @@ -40,6 +40,13 @@ "type": "object", "default": {}, "description": "JSON configuration for LSP-AI generation" + }, + "lsp-ai.inlineCompletionConfiguration": { + "type": "object", + "default": { + "maxCompletionsPerSecond": 1 + }, + "description": "JSON configuration for LSP-AI generation" } } } diff --git a/editors/vscode/src/index.ts b/editors/vscode/src/index.ts index 780bc57..7e062c1 100644 --- a/editors/vscode/src/index.ts +++ b/editors/vscode/src/index.ts @@ -180,6 +180,8 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.commands.registerTextEditorCommand(generateCommand, generateCommandHandler)); // Register as an inline completion provider + let lastInlineCompletion = Date.now(); + let inlineCompletionRequestCounter = 0; vscode.languages.registerInlineCompletionItemProvider({ pattern: '**' }, { provideInlineCompletionItems: async (document: vscode.TextDocument, position: vscode.Position) => { @@ -191,8 +193,24 @@ export function activate(context: vscode.ExtensionContext) { model: generationConfiguration.model, parameters: generationConfiguration.parameters }; - const result = await client.sendRequest("textDocument/generation", params); - return [new vscode.InlineCompletionItem(result["generatedText"])]; + + inlineCompletionRequestCounter += 1; + let localInlineCompletionRequestCounter = inlineCompletionRequestCounter; + + if ((Date.now() - lastInlineCompletion) / 1000 < 1 / inlineCompletionConfiguration["maxCompletionsPerSecond"]) { + await new Promise(r => setTimeout(r, ((1 / inlineCompletionConfiguration["maxCompletionsPerSecond"]) - ((Date.now() - lastInlineCompletion) / 1000 )) * 1000)); + if (inlineCompletionRequestCounter == localInlineCompletionRequestCounter) { + lastInlineCompletion = Date.now(); + const result = await client.sendRequest("textDocument/generation", params); + return [new vscode.InlineCompletionItem(result["generatedText"])]; + } else { + return []; + } + } else { + lastInlineCompletion = Date.now(); + const result = await client.sendRequest("textDocument/generation", params); + return [new vscode.InlineCompletionItem(result["generatedText"])]; + } } } );