mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
🔧 fix: Correct Properties Passed to getResponseSender, Catch OpenAI Errors (#1244)
* fix: attempt to catch more errors, especially when generation started * fix: pass the right properties to getResponseSender * chore: Update .eslintrc.js and fix sendEmail.js linting errors
This commit is contained in:
parent
ae03267d9b
commit
e13b146d6d
10 changed files with 22 additions and 15 deletions
|
|
@ -19,6 +19,9 @@ module.exports = {
|
||||||
'e2e/playwright-report/**/*',
|
'e2e/playwright-report/**/*',
|
||||||
'packages/data-provider/types/**/*',
|
'packages/data-provider/types/**/*',
|
||||||
'packages/data-provider/dist/**/*',
|
'packages/data-provider/dist/**/*',
|
||||||
|
'data-node/**/*',
|
||||||
|
'meili_data/**/*',
|
||||||
|
'node_modules/**/*',
|
||||||
],
|
],
|
||||||
parser: '@typescript-eslint/parser',
|
parser: '@typescript-eslint/parser',
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
|
|
|
||||||
|
|
@ -829,9 +829,12 @@ ${convo}
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
err?.message?.includes('stream ended') ||
|
||||||
|
err?.message?.includes('The server had an error processing your request') ||
|
||||||
err?.message?.includes('missing finish_reason') ||
|
err?.message?.includes('missing finish_reason') ||
|
||||||
(err instanceof OpenAI.OpenAIError && err?.message?.includes('missing finish_reason'))
|
(err instanceof OpenAI.OpenAIError && err?.message?.includes('missing finish_reason'))
|
||||||
) {
|
) {
|
||||||
|
console.error(err);
|
||||||
await abortController.abortCompletion();
|
await abortController.abortCompletion();
|
||||||
return intermediateReply;
|
return intermediateReply;
|
||||||
} else if (err instanceof OpenAI.APIError) {
|
} else if (err instanceof OpenAI.APIError) {
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
const { sendMessage, sendError, countTokens, isEnabled } = require('../utils');
|
const { sendMessage, sendError, countTokens, isEnabled } = require('~/server/utils');
|
||||||
const { saveMessage, getConvo, getConvoTitle } = require('../../models');
|
const { saveMessage, getConvo, getConvoTitle } = require('~/models');
|
||||||
const clearPendingReq = require('../../cache/clearPendingReq');
|
const clearPendingReq = require('~/cache/clearPendingReq');
|
||||||
const spendTokens = require('../../models/spendTokens');
|
|
||||||
const abortControllers = require('./abortControllers');
|
const abortControllers = require('./abortControllers');
|
||||||
|
const spendTokens = require('~/models/spendTokens');
|
||||||
|
|
||||||
async function abortMessage(req, res) {
|
async function abortMessage(req, res) {
|
||||||
const { abortKey } = req.body;
|
const { abortKey } = req.body;
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
||||||
let responseMessageId;
|
let responseMessageId;
|
||||||
let lastSavedTimestamp = 0;
|
let lastSavedTimestamp = 0;
|
||||||
let saveDelay = 100;
|
let saveDelay = 100;
|
||||||
const sender = getResponseSender(endpointOption);
|
const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model });
|
||||||
const user = req.user.id;
|
const user = req.user.id;
|
||||||
|
|
||||||
const getReqData = (data = {}) => {
|
const getReqData = (data = {}) => {
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
||||||
let responseMessageId;
|
let responseMessageId;
|
||||||
let lastSavedTimestamp = 0;
|
let lastSavedTimestamp = 0;
|
||||||
let saveDelay = 100;
|
let saveDelay = 100;
|
||||||
const sender = getResponseSender(endpointOption);
|
const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model });
|
||||||
const newConvo = !conversationId;
|
const newConvo = !conversationId;
|
||||||
const user = req.user.id;
|
const user = req.user.id;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
||||||
let responseMessageId;
|
let responseMessageId;
|
||||||
let lastSavedTimestamp = 0;
|
let lastSavedTimestamp = 0;
|
||||||
let saveDelay = 100;
|
let saveDelay = 100;
|
||||||
const sender = getResponseSender(endpointOption);
|
const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model });
|
||||||
const newConvo = !conversationId;
|
const newConvo = !conversationId;
|
||||||
const user = req.user.id;
|
const user = req.user.id;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
||||||
let promptTokens;
|
let promptTokens;
|
||||||
let lastSavedTimestamp = 0;
|
let lastSavedTimestamp = 0;
|
||||||
let saveDelay = 100;
|
let saveDelay = 100;
|
||||||
const sender = getResponseSender(endpointOption);
|
const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model });
|
||||||
const userMessageId = parentMessageId;
|
const userMessageId = parentMessageId;
|
||||||
const user = req.user.id;
|
const user = req.user.id;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
||||||
let promptTokens;
|
let promptTokens;
|
||||||
let lastSavedTimestamp = 0;
|
let lastSavedTimestamp = 0;
|
||||||
let saveDelay = 100;
|
let saveDelay = 100;
|
||||||
const sender = getResponseSender(endpointOption);
|
const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model });
|
||||||
const userMessageId = parentMessageId;
|
const userMessageId = parentMessageId;
|
||||||
const user = req.user.id;
|
const user = req.user.id;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req,
|
||||||
let promptTokens;
|
let promptTokens;
|
||||||
let lastSavedTimestamp = 0;
|
let lastSavedTimestamp = 0;
|
||||||
let saveDelay = 100;
|
let saveDelay = 100;
|
||||||
const sender = getResponseSender(endpointOption);
|
const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model });
|
||||||
const userMessageId = parentMessageId;
|
const userMessageId = parentMessageId;
|
||||||
const user = req.user.id;
|
const user = req.user.id;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,18 +7,18 @@ const sendEmail = async (email, subject, payload, template) => {
|
||||||
try {
|
try {
|
||||||
const transporterOptions = {
|
const transporterOptions = {
|
||||||
// Use STARTTLS by default instead of obligatory TLS
|
// 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
|
// If explicit STARTTLS is set, require it when connecting
|
||||||
requireTls: process.env.EMAIL_ENCRYPTION === "starttls",
|
requireTls: process.env.EMAIL_ENCRYPTION === 'starttls',
|
||||||
tls: {
|
tls: {
|
||||||
// Whether to accept unsigned certificates
|
// Whether to accept unsigned certificates
|
||||||
rejectUnauthorized: process.env.EMAIL_ALLOW_SELFSIGNED === "true"
|
rejectUnauthorized: process.env.EMAIL_ALLOW_SELFSIGNED === 'true',
|
||||||
},
|
},
|
||||||
auth: {
|
auth: {
|
||||||
user: process.env.EMAIL_USERNAME,
|
user: process.env.EMAIL_USERNAME,
|
||||||
pass: process.env.EMAIL_PASSWORD,
|
pass: process.env.EMAIL_PASSWORD,
|
||||||
},
|
},
|
||||||
}
|
};
|
||||||
|
|
||||||
if (process.env.EMAIL_ENCRYPTION_HOSTNAME) {
|
if (process.env.EMAIL_ENCRYPTION_HOSTNAME) {
|
||||||
// Check the certificate against this name explicitly
|
// Check the certificate against this name explicitly
|
||||||
|
|
@ -40,7 +40,8 @@ const sendEmail = async (email, subject, payload, template) => {
|
||||||
const options = () => {
|
const options = () => {
|
||||||
return {
|
return {
|
||||||
// Header address should contain name-addr
|
// 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}>`,
|
`<${process.env.EMAIL_FROM}>`,
|
||||||
to: `"${payload.name}" <${email}>`,
|
to: `"${payload.name}" <${email}>`,
|
||||||
envelope: {
|
envelope: {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue