diff --git a/.eslintrc.js b/.eslintrc.js index 53277e02c78..a3d71acd69f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -19,6 +19,9 @@ module.exports = { 'e2e/playwright-report/**/*', 'packages/data-provider/types/**/*', 'packages/data-provider/dist/**/*', + 'data-node/**/*', + 'meili_data/**/*', + 'node_modules/**/*', ], parser: '@typescript-eslint/parser', parserOptions: { diff --git a/api/app/clients/OpenAIClient.js b/api/app/clients/OpenAIClient.js index 48946443fb7..c47ce8a5f6e 100644 --- a/api/app/clients/OpenAIClient.js +++ b/api/app/clients/OpenAIClient.js @@ -829,9 +829,12 @@ ${convo} return ''; } if ( + err?.message?.includes('stream ended') || + err?.message?.includes('The server had an error processing your request') || err?.message?.includes('missing finish_reason') || (err instanceof OpenAI.OpenAIError && err?.message?.includes('missing finish_reason')) ) { + console.error(err); await abortController.abortCompletion(); return intermediateReply; } else if (err instanceof OpenAI.APIError) { diff --git a/api/server/middleware/abortMiddleware.js b/api/server/middleware/abortMiddleware.js index a65d09c884f..1177d71d995 100644 --- a/api/server/middleware/abortMiddleware.js +++ b/api/server/middleware/abortMiddleware.js @@ -1,8 +1,8 @@ -const { sendMessage, sendError, countTokens, isEnabled } = require('../utils'); -const { saveMessage, getConvo, getConvoTitle } = require('../../models'); -const clearPendingReq = require('../../cache/clearPendingReq'); -const spendTokens = require('../../models/spendTokens'); +const { sendMessage, sendError, countTokens, isEnabled } = require('~/server/utils'); +const { saveMessage, getConvo, getConvoTitle } = require('~/models'); +const clearPendingReq = require('~/cache/clearPendingReq'); const abortControllers = require('./abortControllers'); +const spendTokens = require('~/models/spendTokens'); async function abortMessage(req, res) { const { abortKey } = req.body; diff --git a/api/server/routes/ask/anthropic.js b/api/server/routes/ask/anthropic.js index 233d3dc2592..85d47972e97 100644 --- a/api/server/routes/ask/anthropic.js +++ b/api/server/routes/ask/anthropic.js @@ -31,7 +31,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, let responseMessageId; let lastSavedTimestamp = 0; let saveDelay = 100; - const sender = getResponseSender(endpointOption); + const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); const user = req.user.id; const getReqData = (data = {}) => { diff --git a/api/server/routes/ask/gptPlugins.js b/api/server/routes/ask/gptPlugins.js index 5d4e5ebcfac..4485588171f 100644 --- a/api/server/routes/ask/gptPlugins.js +++ b/api/server/routes/ask/gptPlugins.js @@ -34,7 +34,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, let responseMessageId; let lastSavedTimestamp = 0; let saveDelay = 100; - const sender = getResponseSender(endpointOption); + const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); const newConvo = !conversationId; const user = req.user.id; diff --git a/api/server/routes/ask/openAI.js b/api/server/routes/ask/openAI.js index 945ed15ddec..43c145b522d 100644 --- a/api/server/routes/ask/openAI.js +++ b/api/server/routes/ask/openAI.js @@ -32,7 +32,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, let responseMessageId; let lastSavedTimestamp = 0; let saveDelay = 100; - const sender = getResponseSender(endpointOption); + const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); const newConvo = !conversationId; const user = req.user.id; diff --git a/api/server/routes/edit/anthropic.js b/api/server/routes/edit/anthropic.js index 66a8a64395e..34c659cc779 100644 --- a/api/server/routes/edit/anthropic.js +++ b/api/server/routes/edit/anthropic.js @@ -33,7 +33,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, let promptTokens; let lastSavedTimestamp = 0; let saveDelay = 100; - const sender = getResponseSender(endpointOption); + const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); const userMessageId = parentMessageId; const user = req.user.id; diff --git a/api/server/routes/edit/gptPlugins.js b/api/server/routes/edit/gptPlugins.js index 8edd24bfe2f..4f1843d3e4c 100644 --- a/api/server/routes/edit/gptPlugins.js +++ b/api/server/routes/edit/gptPlugins.js @@ -34,7 +34,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, let promptTokens; let lastSavedTimestamp = 0; let saveDelay = 100; - const sender = getResponseSender(endpointOption); + const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); const userMessageId = parentMessageId; const user = req.user.id; diff --git a/api/server/routes/edit/openAI.js b/api/server/routes/edit/openAI.js index d4e3bb72816..c701369a315 100644 --- a/api/server/routes/edit/openAI.js +++ b/api/server/routes/edit/openAI.js @@ -33,7 +33,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, let promptTokens; let lastSavedTimestamp = 0; let saveDelay = 100; - const sender = getResponseSender(endpointOption); + const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); const userMessageId = parentMessageId; const user = req.user.id; diff --git a/api/server/utils/sendEmail.js b/api/server/utils/sendEmail.js index 0689d182aa8..d230a90db85 100644 --- a/api/server/utils/sendEmail.js +++ b/api/server/utils/sendEmail.js @@ -7,18 +7,18 @@ const sendEmail = async (email, subject, payload, template) => { try { const transporterOptions = { // Use STARTTLS by default instead of obligatory TLS - secure: process.env.EMAIL_ENCRYPTION === "tls", + secure: process.env.EMAIL_ENCRYPTION === 'tls', // If explicit STARTTLS is set, require it when connecting - requireTls: process.env.EMAIL_ENCRYPTION === "starttls", + requireTls: process.env.EMAIL_ENCRYPTION === 'starttls', tls: { // Whether to accept unsigned certificates - rejectUnauthorized: process.env.EMAIL_ALLOW_SELFSIGNED === "true" + rejectUnauthorized: process.env.EMAIL_ALLOW_SELFSIGNED === 'true', }, auth: { user: process.env.EMAIL_USERNAME, pass: process.env.EMAIL_PASSWORD, }, - } + }; if (process.env.EMAIL_ENCRYPTION_HOSTNAME) { // Check the certificate against this name explicitly @@ -40,7 +40,8 @@ const sendEmail = async (email, subject, payload, template) => { const options = () => { return { // Header address should contain name-addr - from: `"${process.env.EMAIL_FROM_NAME || process.env.APP_TITLE}"` + + from: + `"${process.env.EMAIL_FROM_NAME || process.env.APP_TITLE}"` + `<${process.env.EMAIL_FROM}>`, to: `"${payload.name}" <${email}>`, envelope: {