diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index b06efcf956..cbcd019abc 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -46,6 +46,7 @@ import {FileDecorator} from './app/plugins/file-decorator' import {CodeFormat} from './app/plugins/code-format' import {SolidityUmlGen} from './app/plugins/solidity-umlgen' import {ContractFlattener} from './app/plugins/contractFlattener' +import {OpenAIGpt} from './app/plugins/openaigpt' const isElectron = require('is-electron') @@ -180,6 +181,9 @@ class AppComponent { // ----------------- ContractFlattener ---------------------------- const contractFlattener = new ContractFlattener() + // ----------------- Open AI -------------------------------------- + const openaigpt = new OpenAIGpt() + // ----------------- import content service ------------------------ const contentImport = new CompilerImports() @@ -297,7 +301,8 @@ class AppComponent { search, solidityumlgen, contractFlattener, - solidityScript + solidityScript, + openaigpt ]) // LAYOUT & SYSTEM VIEWS @@ -410,7 +415,7 @@ class AppComponent { ]) await this.appManager.activatePlugin(['settings']) await this.appManager.activatePlugin(['walkthrough', 'storage', 'search', 'compileAndRun', 'recorder']) - await this.appManager.activatePlugin(['solidity-script']) + await this.appManager.activatePlugin(['solidity-script', 'openaigpt']) this.appManager.on('filePanel', 'workspaceInitializationCompleted', async () => { // for e2e tests diff --git a/apps/remix-ide/src/app/plugins/openaigpt.tsx b/apps/remix-ide/src/app/plugins/openaigpt.tsx new file mode 100644 index 0000000000..c2c51e88a6 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/openaigpt.tsx @@ -0,0 +1,37 @@ +import { Plugin } from '@remixproject/engine' +import { OpenAIApi, CreateChatCompletionResponse } from 'openai' + +const _paq = window._paq = window._paq || [] + +const profile = { + name: 'openaigpt', + displayName: 'openaigpt', + description: 'openaigpt', + methods: ['message'], + events: [], + maintainedBy: 'Remix', +} + +export class OpenAIGpt extends Plugin { + openai: OpenAIApi + + constructor() { + super(profile) + } + + async message(prompt): Promise { + this.call('terminal', 'log', 'Waiting for GPT answer...') + const result = await (await fetch('https://openai-gpt.remixproject.org', { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({prompt}) + })).json() + + console.log(result) + this.call('terminal', 'log', { type: 'typewriterlog', value: result.choices[0].message.content }) + return result.data + } +} \ No newline at end of file diff --git a/libs/remix-ui/renderer/src/lib/renderer.tsx b/libs/remix-ui/renderer/src/lib/renderer.tsx index 41d860bc18..fd1f410026 100644 --- a/libs/remix-ui/renderer/src/lib/renderer.tsx +++ b/libs/remix-ui/renderer/src/lib/renderer.tsx @@ -67,6 +67,21 @@ export const Renderer = ({message, opt = {}, plugin}: RendererProps) => { } } + const askGtp = async () => { + try { + const content = await plugin.call('fileManager', 'readFile', editorOptions.errFile) + const message = ` + solidity file: ${content} + error message: ${messageText} + explain which line the error occured, the reason and how to fix it. + ` + await plugin.call('openaigpt', 'message', message) + } catch (err) { + console.error('unable to askGtp') + console.error(err) + } + } + return ( <> {messageText && !close && ( @@ -82,6 +97,7 @@ export const Renderer = ({message, opt = {}, plugin}: RendererProps) => { + { askGtp() }}>ASK GPT )} diff --git a/package.json b/package.json index a435925994..48bff5484a 100644 --- a/package.json +++ b/package.json @@ -178,6 +178,7 @@ "latest-version": "^5.1.0", "merge": "^2.1.1", "npm-install-version": "^6.0.2", + "openai": "^3.3.0", "path-browserify": "^1.0.1", "prettier": "^2.8.4", "prettier-plugin-solidity": "^1.0.0-beta.24", diff --git a/yarn.lock b/yarn.lock index 0fbc819922..ffcbd9053a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21152,6 +21152,14 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +openai@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-3.3.0.tgz#a6408016ad0945738e1febf43f2fccca83a3f532" + integrity sha512-uqxI/Au+aPRnsaQRe8CojU0eCR7I0mBiKjD3sNMzY6DaC1ZVrc85u98mtJW6voDug8fgGN+DIZmTDxTthxb7dQ== + dependencies: + axios "^0.26.0" + form-data "^4.0.0" + opener@^1.5.1, opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"