diff --git a/extension.js b/extension.js
index 1f15f87..a801838 100644
--- a/extension.js
+++ b/extension.js
@@ -1,4 +1,13 @@
const vscode = require('vscode');
+const { Configuration, OpenAIApi } = require("openai");
+
+// move these into the script so that instead of echoing the question and the contents,
+// it will echo the question, followed by the answer from the response when the submit button is pressed.
+const configuration = new Configuration({
+ apiKey: process.env.OPENAI_API_KEY,
+});
+
+const openai = new OpenAIApi(configuration);
// Represents a file item in the file explorer
class FileItem {
@@ -77,7 +86,7 @@ const openGPTContextPanelCommand = vscode.commands.registerCommand('extension.op
panel.webview.html = getWebviewContent();
- panel.webview.onDidReceiveMessage(message => {
+ panel.webview.onDidReceiveMessage(async message => {
if (message.command === 'submitQuestion') {
const question = message.text;
const selectedUris = message.selectedUris;
@@ -101,7 +110,27 @@ const openGPTContextPanelCommand = vscode.commands.registerCommand('extension.op
})
.join('\n\n');
- panel.webview.html = getWebviewContent(fileContents, question);
+ // Call OpenAI API with the question and file contents
+ try {
+ const chatCompletion = await openai.createChatCompletion({
+ model: "gpt-3.5-turbo",
+ messages: [
+ { role: "system", content: "Answer the coding questions, only provide the code and documentation, explaining the solution after providing the code." },
+ { role: "user", content: question },
+ { role: "assistant", content: fileContents }
+ ],
+ });
+
+ // Extract the answer from the OpenAI response
+ const answer = chatCompletion.data.choices[0].message.content;
+
+ // Update the webview content to display only the OpenAI response
+ panel.webview.html = getWebviewContent(answer, question);
+ } catch (error) {
+ // Handle any errors from the OpenAI API
+ console.error("Failed to get OpenAI response:", error);
+ panel.webview.html = getWebviewContent(`Failed to get response from OpenAI API. Error: ${error.message}`, question);
+ }
} else if (message.command === 'toggleFileSelection') {
const uri = message.uri;
const file = selectedFiles.find(file => file.uri.fsPath === uri);
@@ -123,6 +152,7 @@ const openGPTContextPanelCommand = vscode.commands.registerCommand('extension.op
});
});
+
// Command for refreshing the selected files
const refreshSelectedFilesCommand = vscode.commands.registerCommand('extension.refreshSelectedFiles', () => {
fileDataProvider.refresh();
@@ -142,7 +172,7 @@ const refreshFilesCommand = vscode.commands.registerCommand('extension.refreshFi
});
// Helper function to generate the HTML content for the webview panel
-function getWebviewContent(fileContents, question) {
+function getWebviewContent(apiResponse = '', question = '') {
const fileList = selectedFiles
.map(
file =>
@@ -152,19 +182,6 @@ function getWebviewContent(fileContents, question) {
)
.join('');
- const formattedContents = selectedFiles
- .filter(file => file.selected)
- .map(file => {
- const document = vscode.workspace.textDocuments.find(doc => doc.uri.fsPath === file.uri.fsPath);
- if (document) {
- const lines = document.getText().split('\n');
- const formattedLines = lines.map(line => `\t${line}`).join('\n');
- return `${file.uri.fsPath}:\n\`\`\`\n${formattedLines}\n\`\`\``;
- }
- return '';
- })
- .join('\n\n');
-
return `
@@ -180,7 +197,7 @@ function getWebviewContent(fileContents, question) {
${question ? question : ''}
${
- fileContents ? `
` : ''
+ apiResponse ? `
` : ''
}
diff --git a/package-lock.json b/package-lock.json
index a4bb790..ce8b9b7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,9 @@
"": {
"name": "gpt-contextfiles",
"version": "0.0.1",
+ "dependencies": {
+ "openai": "^3.3.0"
+ },
"devDependencies": {
"@types/glob": "^8.1.0",
"@types/mocha": "^10.0.1",
@@ -305,6 +308,19 @@
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "0.26.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
+ "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+ "dependencies": {
+ "follow-redirects": "^1.14.8"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -453,6 +469,17 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -514,6 +541,14 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/diff": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
@@ -800,6 +835,38 @@
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
"dev": true
},
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -1203,6 +1270,25 @@
"node": ">=10"
}
},
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -1371,6 +1457,15 @@
"wrappy": "1"
}
},
+ "node_modules/openai": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/openai/-/openai-3.3.0.tgz",
+ "integrity": "sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ==",
+ "dependencies": {
+ "axios": "^0.26.0",
+ "form-data": "^4.0.0"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
diff --git a/package.json b/package.json
index 1d40b67..f4ee1b0 100644
--- a/package.json
+++ b/package.json
@@ -17,31 +17,31 @@
"contributes": {
"commands": [
{
- "command": "extension.addFilesToGPTContext",
- "title": "Add Files to GPT Context",
- "category": "Explorer"
+ "command": "extension.addFilesToGPTContext",
+ "title": "Add Files to GPT Context",
+ "category": "Explorer"
},
{
- "command": "extension.openGPTContextPanel",
- "title": "Open GPT Context Panel"
+ "command": "extension.openGPTContextPanel",
+ "title": "Open GPT Context Panel"
},
{
- "command": "extension.refreshSelectedFiles",
- "title": "Refresh Selected Files"
+ "command": "extension.refreshSelectedFiles",
+ "title": "Refresh Selected Files"
},
{
- "command": "extension.clearSelectedFiles",
- "title": "Clear Selected Files"
+ "command": "extension.clearSelectedFiles",
+ "title": "Clear Selected Files"
}
],
"menus": {
- "explorer/context": [
- {
- "when": "resourceLangId == javascript",
- "command": "extension.addFilesToGPTContext",
- "group": "navigation"
- }
- ]
+ "explorer/context": [
+ {
+ "when": "resourceLangId == javascript",
+ "command": "extension.addFilesToGPTContext",
+ "group": "navigation"
+ }
+ ]
}
},
"scripts": {
@@ -50,15 +50,17 @@
"test": "node ./test/runTest.js"
},
"devDependencies": {
- "@types/vscode": "^1.79.0",
"@types/glob": "^8.1.0",
"@types/mocha": "^10.0.1",
"@types/node": "20.2.5",
+ "@types/vscode": "^1.79.0",
+ "@vscode/test-electron": "^2.3.2",
"eslint": "^8.41.0",
"glob": "^8.1.0",
"mocha": "^10.2.0",
- "typescript": "^5.1.3",
- "@vscode/test-electron": "^2.3.2"
+ "typescript": "^5.1.3"
+ },
+ "dependencies": {
+ "openai": "^3.3.0"
}
-
}