| import axios from 'axios'; |
| import { logger } from '@librechat/data-schemas'; |
| import type { AxiosInstance, AxiosProxyConfig, AxiosError } from 'axios'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| export const logAxiosError = ({ |
| message, |
| error, |
| }: { |
| message: string; |
| error: AxiosError | Error | unknown; |
| }) => { |
| let logMessage = message; |
| try { |
| const stack = |
| error != null |
| ? (error as Error | AxiosError)?.stack || 'No stack trace available' |
| : 'No stack trace available'; |
| const errorMessage = |
| error != null |
| ? (error as Error | AxiosError)?.message || 'No error message available' |
| : 'No error message available'; |
|
|
| if (axios.isAxiosError(error) && error.response && error.response?.status) { |
| const { status, headers, data } = error.response; |
| logMessage = `${message} The server responded with status ${status}: ${error.message}`; |
| logger.error(logMessage, { |
| status, |
| headers, |
| data, |
| stack, |
| }); |
| } else if (axios.isAxiosError(error) && error.request) { |
| const { method, url } = error.config || {}; |
| logMessage = `${message} No response received for ${method ? method.toUpperCase() : ''} ${url || ''}: ${error.message}`; |
| logger.error(logMessage, { |
| requestInfo: { method, url }, |
| stack, |
| }); |
| } else if (errorMessage?.includes("Cannot read properties of undefined (reading 'status')")) { |
| logMessage = `${message} It appears the request timed out or was unsuccessful: ${errorMessage}`; |
| logger.error(logMessage, { stack }); |
| } else { |
| logMessage = `${message} An error occurred while setting up the request: ${errorMessage}`; |
| logger.error(logMessage, { stack }); |
| } |
| } catch (err: unknown) { |
| logMessage = `Error in logAxiosError: ${(err as Error).message}`; |
| logger.error(logMessage, { stack: (err as Error).stack || 'No stack trace available' }); |
| } |
| return logMessage; |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| export function createAxiosInstance(): AxiosInstance { |
| const instance = axios.create(); |
|
|
| if (process.env.proxy) { |
| try { |
| const url = new URL(process.env.proxy); |
|
|
| const proxyConfig: Partial<AxiosProxyConfig> = { |
| host: url.hostname.replace(/^\[|\]$/g, ''), |
| protocol: url.protocol.replace(':', ''), |
| }; |
|
|
| if (url.port) { |
| proxyConfig.port = parseInt(url.port, 10); |
| } |
|
|
| instance.defaults.proxy = proxyConfig as AxiosProxyConfig; |
| } catch (error) { |
| console.error('Error parsing proxy URL:', error); |
| throw new Error(`Invalid proxy URL: ${process.env.proxy}`); |
| } |
| } |
|
|
| return instance; |
| } |
|
|