diff --git a/.env.example b/.env.example index 6866e10c..a5c6e381 100644 --- a/.env.example +++ b/.env.example @@ -28,6 +28,7 @@ VERCEL_DEPLOY_HOOK_URL= OPENAI_TIMEOUT= OPENAI_API_KEY= +OPENAI_BASE_URL= OPENAI_COMPLETION_MODEL= OPENAI_COMPLETION_TEMPERATURE= OPENAI_COMPLETION_MAX_TOKENS= diff --git a/CHANGELOG.md b/CHANGELOG.md index f6af0376..a6241041 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 4.6.0 (2023-05-03) + +### New Features + +- Support `gpt-4` model + ## 4.5.0 (2023-04-27) ### New Features diff --git a/README.md b/README.md index 3ca7aebe..9126a789 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,9 @@ GPT AI Assistant is an application that is implemented using the OpenAI API and ## News -- 2023-03-05: The `4.1` version now support the audio message of LINE and `whisper-1` language model of OpenAI. :fire: -- 2023-03-02: The `4.0` version now support `gpt-3.5-turbo` language model of OpenAI. :fire: +- 2023-05-03: The `4.6` version now support `gpt-4` OpenAI model. :fire: +- 2023-03-05: The `4.1` version now support the audio message of LINE and `whisper-1` OpenAI model. :fire: +- 2023-03-02: The `4.0` version now support `gpt-3.5-turbo` OpenAI model. :fire: ## Documentations diff --git a/config/index.js b/config/index.js index 385d8607..07a8a355 100644 --- a/config/index.js +++ b/config/index.js @@ -34,6 +34,7 @@ const config = Object.freeze({ VERCEL_DEPLOY_HOOK_URL: env.VERCEL_DEPLOY_HOOK_URL || null, OPENAI_TIMEOUT: env.OPENAI_TIMEOUT || env.APP_API_TIMEOUT, OPENAI_API_KEY: env.OPENAI_API_KEY || null, + OPENAI_BASE_URL: env.OPENAI_BASE_URL || 'https://api.openai.com', OPENAI_COMPLETION_MODEL: env.OPENAI_COMPLETION_MODEL || 'gpt-3.5-turbo', OPENAI_COMPLETION_TEMPERATURE: Number(env.OPENAI_COMPLETION_TEMPERATURE) || 0.9, OPENAI_COMPLETION_MAX_TOKENS: Number(env.OPENAI_COMPLETION_MAX_TOKENS) || 160, diff --git a/package-lock.json b/package-lock.json index 36570507..dbec2f79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gpt-ai-assistant", - "version": "4.5.0", + "version": "4.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "gpt-ai-assistant", - "version": "4.5.0", + "version": "4.6.0", "dependencies": { "axios": "^1.2.1", "dotenv": "^16.0.3", diff --git a/package.json b/package.json index b05a1116..a4f95ed9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gpt-ai-assistant", - "version": "4.5.0", + "version": "4.6.0", "type": "module", "scripts": { "dev": "nodemon api/index.js", diff --git a/services/openai.js b/services/openai.js index 6363cad4..9f7f0181 100644 --- a/services/openai.js +++ b/services/openai.js @@ -15,10 +15,11 @@ export const IMAGE_SIZE_512 = '512x512'; export const IMAGE_SIZE_1024 = '1024x1024'; export const MODEL_GPT_3_5_TURBO = 'gpt-3.5-turbo'; +export const MODEL_GPT_4 = 'gpt-4'; export const MODEL_WHISPER_1 = 'whisper-1'; const client = axios.create({ - baseURL: 'https://api.openai.com', + baseURL: config.OPENAI_BASE_URL, timeout: config.OPENAI_TIMEOUT, headers: { 'Accept-Encoding': 'gzip, deflate, compress', diff --git a/utils/generate-completion.js b/utils/generate-completion.js index 8e0de0ff..bbfe030e 100644 --- a/utils/generate-completion.js +++ b/utils/generate-completion.js @@ -1,8 +1,6 @@ import config from '../config/index.js'; import { MOCK_TEXT_OK } from '../constants/mock.js'; -import { - createChatCompletion, createTextCompletion, FINISH_REASON_STOP, MODEL_GPT_3_5_TURBO, -} from '../services/openai.js'; +import { createChatCompletion, createTextCompletion, FINISH_REASON_STOP } from '../services/openai.js'; class Completion { text; @@ -22,6 +20,11 @@ class Completion { } } +const isChatCompletionModel = (model) => ( + String(model).startsWith('gpt-4') + || String(model).startsWith('gpt-3.5') +); + /** * @param {Object} param * @param {Prompt} param.prompt @@ -31,7 +34,7 @@ const generateCompletion = async ({ prompt, }) => { if (config.APP_ENV !== 'production') return new Completion({ text: MOCK_TEXT_OK }); - if (config.OPENAI_COMPLETION_MODEL.includes(MODEL_GPT_3_5_TURBO)) { + if (isChatCompletionModel(config.OPENAI_COMPLETION_MODEL)) { const { data } = await createChatCompletion({ messages: prompt.messages }); const [choice] = data.choices; return new Completion({