From dd0722471a69c74b2a816d118ab2e2c3a489e2f0 Mon Sep 17 00:00:00 2001 From: Jakevin Date: Thu, 25 Apr 2024 22:58:04 +0900 Subject: [PATCH 1/5] init --- services/openai.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/openai.js b/services/openai.js index aa1ac599..1d966820 100644 --- a/services/openai.js +++ b/services/openai.js @@ -23,6 +23,8 @@ const client = axios.create({ timeout: config.OPENAI_TIMEOUT, headers: { 'Accept-Encoding': 'gzip, deflate, compress', + "HTTP-Referer": `https://line.me`, // Optional, for including your app on openrouter.ai rankings. + "X-Title": `LINE Chatbot`, // Optional, for including your app on openrouter.ai rankings. }, }); From bc6cfc7859d2cf356fe8aceea20cc53a875e46eb Mon Sep 17 00:00:00 2001 From: Jakevin Date: Thu, 25 Apr 2024 23:28:29 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=E6=88=91=E5=8F=AA=E7=94=A8=20chat?= =?UTF-8?q?=20=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/generate-completion.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/utils/generate-completion.js b/utils/generate-completion.js index 458570e3..f08ea1a5 100644 --- a/utils/generate-completion.js +++ b/utils/generate-completion.js @@ -20,10 +20,12 @@ class Completion { } } -const isChatCompletionModel = (model) => ( - String(model).startsWith('ft:gpt') - || String(model).startsWith('gpt') -); +// const isChatCompletionModel = (model) => ( +// String(model).startsWith('ft:gpt') +// || String(model).startsWith('gpt') +// ); + +const isChatCompletionModel = (model) => (true); /** * @param {Object} param From 3e9992c34a28a365140a12fb9c305a83922ab342 Mon Sep 17 00:00:00 2001 From: Jakevin Date: Fri, 26 Apr 2024 00:26:37 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4API=20path?= =?UTF-8?q?=E7=9A=84v1=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/index.js | 2 +- services/openai.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/config/index.js b/config/index.js index ba16065e..5dcfb25f 100644 --- a/config/index.js +++ b/config/index.js @@ -34,7 +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_BASE_URL: env.OPENAI_BASE_URL || 'https://api.openai.com/v1', OPENAI_COMPLETION_MODEL: env.OPENAI_COMPLETION_MODEL || 'gpt-3.5-turbo', OPENAI_COMPLETION_TEMPERATURE: Number(env.OPENAI_COMPLETION_TEMPERATURE) || 1, OPENAI_COMPLETION_MAX_TOKENS: Number(env.OPENAI_COMPLETION_MAX_TOKENS) || 64, diff --git a/services/openai.js b/services/openai.js index 1d966820..b9de6688 100644 --- a/services/openai.js +++ b/services/openai.js @@ -47,7 +47,7 @@ const createChatCompletion = ({ maxTokens = config.OPENAI_COMPLETION_MAX_TOKENS, frequencyPenalty = config.OPENAI_COMPLETION_FREQUENCY_PENALTY, presencePenalty = config.OPENAI_COMPLETION_PRESENCE_PENALTY, -}) => client.post('/v1/chat/completions', { +}) => client.post('/chat/completions', { model, messages, temperature, @@ -64,7 +64,7 @@ const createTextCompletion = ({ frequencyPenalty = config.OPENAI_COMPLETION_FREQUENCY_PENALTY, presencePenalty = config.OPENAI_COMPLETION_PRESENCE_PENALTY, stop = config.OPENAI_COMPLETION_STOP_SEQUENCES, -}) => client.post('/v1/completions', { +}) => client.post('/completions', { model, prompt, temperature, @@ -78,7 +78,7 @@ const createImage = ({ prompt, n = 1, size = IMAGE_SIZE_256, -}) => client.post('/v1/images/generations', { +}) => client.post('/images/generations', { prompt, n, size, @@ -92,7 +92,7 @@ const createAudioTranscriptions = ({ const formData = new FormData(); formData.append('file', buffer, file); formData.append('model', model); - return client.post('/v1/audio/transcriptions', formData.getBuffer(), { + return client.post('/audio/transcriptions', formData.getBuffer(), { headers: formData.getHeaders(), }); }; From 4c84c34613756f5036f21d9933938ab28cbbcafe Mon Sep 17 00:00:00 2001 From: Jakevin Date: Fri, 26 Apr 2024 00:51:27 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20provider=20?= =?UTF-8?q?=E8=B3=87=E8=A8=8A=E3=80=81=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/index.js | 3 +++ services/openai.js | 26 +++++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/config/index.js b/config/index.js index 5dcfb25f..d5bd34f3 100644 --- a/config/index.js +++ b/config/index.js @@ -48,6 +48,9 @@ const config = Object.freeze({ SERPAPI_TIMEOUT: env.SERPAPI_TIMEOUT || env.APP_API_TIMEOUT, SERPAPI_API_KEY: env.SERPAPI_API_KEY || null, SERPAPI_LOCATION: env.SERPAPI_LOCATION || 'tw', + PROVIDER_BASE_URL: env.PROVIDER_BASE_URL || 'https://api.openai.com/v1', + PROVIDER_BASE_TOKEN: env.PROVIDER_BASE_TOKEN || null, + PROVIDER_BASE_MODEL: env.PROVIDER_BASE_MODEL || 'gpt-3.5-turbo', }); export default config; diff --git a/services/openai.js b/services/openai.js index b9de6688..f4822f8e 100644 --- a/services/openai.js +++ b/services/openai.js @@ -18,8 +18,9 @@ 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 BASE_URL = config.PROVIDER_BASE_URL; + const client = axios.create({ - baseURL: config.OPENAI_BASE_URL, timeout: config.OPENAI_TIMEOUT, headers: { 'Accept-Encoding': 'gzip, deflate, compress', @@ -29,7 +30,7 @@ const client = axios.create({ }); client.interceptors.request.use((c) => { - c.headers.Authorization = `Bearer ${config.OPENAI_API_KEY}`; + c.headers.Authorization = `Bearer ${config.PROVIDER_BASE_TOKEN}`; return handleRequest(c); }); @@ -41,13 +42,13 @@ client.interceptors.response.use(handleFulfilled, (err) => { }); const createChatCompletion = ({ - model = config.OPENAI_COMPLETION_MODEL, + model = config.PROVIDER_BASE_MODEL, messages, temperature = config.OPENAI_COMPLETION_TEMPERATURE, maxTokens = config.OPENAI_COMPLETION_MAX_TOKENS, frequencyPenalty = config.OPENAI_COMPLETION_FREQUENCY_PENALTY, presencePenalty = config.OPENAI_COMPLETION_PRESENCE_PENALTY, -}) => client.post('/chat/completions', { +}) => client.post(BASE_URL + '/chat/completions', { model, messages, temperature, @@ -57,14 +58,14 @@ const createChatCompletion = ({ }); const createTextCompletion = ({ - model = config.OPENAI_COMPLETION_MODEL, + model = config.PROVIDER_BASE_MODEL, prompt, temperature = config.OPENAI_COMPLETION_TEMPERATURE, maxTokens = config.OPENAI_COMPLETION_MAX_TOKENS, frequencyPenalty = config.OPENAI_COMPLETION_FREQUENCY_PENALTY, presencePenalty = config.OPENAI_COMPLETION_PRESENCE_PENALTY, stop = config.OPENAI_COMPLETION_STOP_SEQUENCES, -}) => client.post('/completions', { +}) => client.post(BASE_URL + '/completions', { model, prompt, temperature, @@ -78,10 +79,14 @@ const createImage = ({ prompt, n = 1, size = IMAGE_SIZE_256, -}) => client.post('/images/generations', { +}) => client.post(config.OPENAI_BASE_URL + '/images/generations', { prompt, n, size, +}, { + headers: { + Authorization: `Bearer ${config.OPENAI_API_KEY}` + }, }); const createAudioTranscriptions = ({ @@ -92,8 +97,11 @@ const createAudioTranscriptions = ({ const formData = new FormData(); formData.append('file', buffer, file); formData.append('model', model); - return client.post('/audio/transcriptions', formData.getBuffer(), { - headers: formData.getHeaders(), + var headers = formData.getHeaders(); + headers['Authorization'] = `Bearer ${config.OPENAI_API_KEY}`; + + return client.post(config.OPENAI_BASE_URL + '/audio/transcriptions', formData.getBuffer(), { + headers: headers, }); }; From a39dfa824dc8e30c6394166186a0f717f988223c Mon Sep 17 00:00:00 2001 From: Jakevin Date: Fri, 26 Apr 2024 01:00:56 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=E6=A0=B9=E6=93=9A=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84Provider=20=E6=8F=90=E4=BE=9B=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=20token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/openai.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/services/openai.js b/services/openai.js index f4822f8e..197f29d0 100644 --- a/services/openai.js +++ b/services/openai.js @@ -23,6 +23,7 @@ const BASE_URL = config.PROVIDER_BASE_URL; const client = axios.create({ timeout: config.OPENAI_TIMEOUT, headers: { + 'Provieder': '', 'Accept-Encoding': 'gzip, deflate, compress', "HTTP-Referer": `https://line.me`, // Optional, for including your app on openrouter.ai rankings. "X-Title": `LINE Chatbot`, // Optional, for including your app on openrouter.ai rankings. @@ -30,7 +31,13 @@ const client = axios.create({ }); client.interceptors.request.use((c) => { - c.headers.Authorization = `Bearer ${config.PROVIDER_BASE_TOKEN}`; + if (c.headers.Provieder === 'openai') { + c.headers.Authorization = `Bearer ${config.OPENAI_API_KEY}`; + + } else { + c.headers.Authorization = `Bearer ${config.PROVIDER_BASE_TOKEN}`; + + } return handleRequest(c); }); @@ -85,7 +92,7 @@ const createImage = ({ size, }, { headers: { - Authorization: `Bearer ${config.OPENAI_API_KEY}` + Provieder: 'openai', }, }); @@ -98,8 +105,7 @@ const createAudioTranscriptions = ({ formData.append('file', buffer, file); formData.append('model', model); var headers = formData.getHeaders(); - headers['Authorization'] = `Bearer ${config.OPENAI_API_KEY}`; - + headers['Provieder'] = 'openai'; return client.post(config.OPENAI_BASE_URL + '/audio/transcriptions', formData.getBuffer(), { headers: headers, });