diff --git a/lib/core.js b/lib/core.js index 66ac23a..4bdfae6 100644 --- a/lib/core.js +++ b/lib/core.js @@ -334,6 +334,44 @@ handler.prototype.exit = function(args, fn) { this.emit("close"); }; +handler.prototype.gpt = function(args, fn) { + let result = { + lines: [ + "--- ChatGPT API Ready ---", + `> ${args[0]}` + ], + time: moment() + }; + + core.display(result); + + const { Configuration, OpenAIApi } = require("openai"); + const configuration = new Configuration({ + apiKey: util.openai_api_key + }); + + const openai = new OpenAIApi(configuration); + + (async () => { + const completion = await openai.createChatCompletion({ + model: "gpt-3.5-turbo", + messages: [{ role: "user", content: args[0] }], + }); + + let responseLines = ["--- ChatGPT API Response ---", ...completion.data.choices[0].message.content.split(/\n/)]; + + let result = { + lines: responseLines, + time: moment() + }; + + core.display(result); + + })(); + + fn(null, args); +}; + (new cli(new handler())).run(); module.exports = core; diff --git a/lib/utility.js b/lib/utility.js index b249e44..f1b98e8 100644 --- a/lib/utility.js +++ b/lib/utility.js @@ -17,6 +17,7 @@ let initialize = () => { utility.buffer = {}; utility.theme = {}; utility.twitter = {}; + utility.openai_api_token = ""; }; initialize(); @@ -159,6 +160,10 @@ utility.parseSettingFile = (path) => { utility.twitter = settings.twitter; } } + + if (settings.openai_api_key) { + utility.openai_api_key = settings.openai_api_key; + } }; utility.decolateText = (message) => { diff --git a/package-lock.json b/package-lock.json index e8bfcaf..e27128f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "moment": "^2.29.4", "nconf": "^0.12.0", "node-emoji": "^1.11.0", + "openai": "^3.2.1", "shell": "^0.8.5", "sprintf-js": "^1.1.2", "twitter": "^1.7.1", @@ -1887,6 +1888,36 @@ "fn.name": "1.x.x" } }, + "node_modules/openai": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", + "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", + "dependencies": { + "axios": "^0.26.0", + "form-data": "^4.0.0" + } + }, + "node_modules/openai/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/openai/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/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -4167,6 +4198,35 @@ "fn.name": "1.x.x" } }, + "openai": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", + "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", + "requires": { + "axios": "^0.26.0", + "form-data": "^4.0.0" + }, + "dependencies": { + "axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "requires": { + "follow-redirects": "^1.14.8" + } + }, + "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==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "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 3b2898e..c3e2a28 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "moment": "^2.29.4", "nconf": "^0.12.0", "node-emoji": "^1.11.0", + "openai": "^3.2.1", "shell": "^0.8.5", "sprintf-js": "^1.1.2", "twitter": "^1.7.1", diff --git a/test/settings_sample.yaml b/test/settings_sample.yaml index feae695..469fe1a 100644 --- a/test/settings_sample.yaml +++ b/test/settings_sample.yaml @@ -31,4 +31,4 @@ twitter: consumer_secret: CONSUMER_SECRET_SAMPLE access_token_key: ACCESS_TOKEN_KEY_SAMPLE access_token_secret: ACCESS_TOKEN_SECRET_SAMPLE - +openai_api_key: sk-xxxxxyyyyyzzzzzz diff --git a/test/util_test.js b/test/util_test.js index a7eecaf..2d52243 100644 --- a/test/util_test.js +++ b/test/util_test.js @@ -100,6 +100,11 @@ describe("設定ファイル読み込みのテスト", () => { assert.equal(util.theme.date, "red", "日付の表示用色指定が読み込めている"); }); + it("OpenAI API用の設定が読めていること", () => { + util.parseSettingFile('./test/settings_sample.yaml'); + assert.equal(util.openai_api_key, "sk-xxxxxyyyyyzzzzzz", "OpenAI API用のキーが読み取れている"); + }); + describe("twitter設定読み込みのテスト", () => { it("twitterの設定が無いYAMLファイルの場合、util.twitterのプロパティがfalseになっていること", () => { util.parseSettingFile('./test/settings_sample_without_twitter.yaml');