diff --git a/public/scripts/openai.js b/public/scripts/openai.js index 9794884db..73da02abc 100644 --- a/public/scripts/openai.js +++ b/public/scripts/openai.js @@ -123,6 +123,32 @@ const j2_max_pres = 5.0; const openrouter_website_model = 'OR_Website'; const openai_max_stop_strings = 4; +const textCompletionModels = [ + "text-davinci-003", + "text-davinci-002", + "text-davinci-001", + "text-curie-001", + "text-babbage-001", + "text-ada-001", + "code-davinci-002", + "code-davinci-001", + "code-cushman-002", + "code-cushman-001", + "text-davinci-edit-001", + "code-davinci-edit-001", + "text-embedding-ada-002", + "text-similarity-davinci-001", + "text-similarity-curie-001", + "text-similarity-babbage-001", + "text-similarity-ada-001", + "text-search-davinci-doc-001", + "text-search-curie-doc-001", + "text-search-babbage-doc-001", + "text-search-ada-doc-001", + "code-search-babbage-code-001", + "code-search-ada-code-001", +]; + let biasCache = undefined; let model_list = []; @@ -1123,7 +1149,7 @@ async function sendOpenAIRequest(type, openai_msgs_tosend, signal) { const isOpenRouter = oai_settings.chat_completion_source == chat_completion_sources.OPENROUTER; const isScale = oai_settings.chat_completion_source == chat_completion_sources.SCALE; const isAI21 = oai_settings.chat_completion_source == chat_completion_sources.AI21; - const isTextCompletion = oai_settings.chat_completion_source == chat_completion_sources.OPENAI && (oai_settings.openai_model.startsWith('text-') || oai_settings.openai_model.startsWith('code-')); + const isTextCompletion = oai_settings.chat_completion_source == chat_completion_sources.OPENAI && textCompletionModels.includes(oai_settings.openai_model); const isQuiet = type === 'quiet'; const stream = oai_settings.stream_openai && !isQuiet && !isScale && !isAI21; diff --git a/server.js b/server.js index 8d7e0a4b2..951a10399 100644 --- a/server.js +++ b/server.js @@ -235,6 +235,35 @@ function countClaudeTokens(tokenizer, messages) { const tokenizersCache = {}; +/** + * @type {import('@dqbd/tiktoken').TiktokenModel[]} + */ +const textCompletionModels = [ + "text-davinci-003", + "text-davinci-002", + "text-davinci-001", + "text-curie-001", + "text-babbage-001", + "text-ada-001", + "code-davinci-002", + "code-davinci-001", + "code-cushman-002", + "code-cushman-001", + "text-davinci-edit-001", + "code-davinci-edit-001", + "text-embedding-ada-002", + "text-similarity-davinci-001", + "text-similarity-curie-001", + "text-similarity-babbage-001", + "text-similarity-ada-001", + "text-search-davinci-doc-001", + "text-search-curie-doc-001", + "text-search-babbage-doc-001", + "text-search-ada-doc-001", + "code-search-babbage-code-001", + "code-search-ada-code-001", +]; + function getTokenizerModel(requestModel) { if (requestModel.includes('claude')) { return 'claude'; @@ -252,7 +281,7 @@ function getTokenizerModel(requestModel) { return 'gpt-3.5-turbo'; } - if (requestModel.startsWith('text-') || requestModel.startsWith('code-')) { + if (textCompletionModels.includes(requestModel)) { return requestModel; } @@ -3389,7 +3418,7 @@ app.post("/generate_openai", jsonParser, function (request, response_generate_op bodyParams['stop'] = request.body.stop; } - const isTextCompletion = Boolean(request.body.model && (request.body.model.startsWith('text-') || request.body.model.startsWith('code-'))); + const isTextCompletion = Boolean(request.body.model && textCompletionModels.includes(request.body.model)); const textPrompt = isTextCompletion ? convertChatMLPrompt(request.body.messages) : ''; const endpointUrl = isTextCompletion ? `${api_url}/completions` : `${api_url}/chat/completions`; @@ -3418,7 +3447,7 @@ app.post("/generate_openai", jsonParser, function (request, response_generate_op "frequency_penalty": request.body.frequency_penalty, "top_p": request.body.top_p, "top_k": request.body.top_k, - "stop": request.body.stop, + "stop": isTextCompletion === false ? request.body.stop : undefined, "logit_bias": request.body.logit_bias, ...bodyParams, }),