| 1043 | | 1043 | |
| 1044 | export const router = express.Router(); | 1044 | export const router = express.Router(); |
| 1045 | | 1045 | |
| 1046 | router.post('/status', async function (request, response_getstatus_openai) { | 1046 | router.post('/status', async function (request, statusResponse) { |
| 1047 | if (!request.body) return response_getstatus_openai.sendStatus(400); | 1047 | if (!request.body) return statusResponse.sendStatus(400); |
| 1048 | | 1048 | |
| 1049 | let api_url; | 1049 | let apiUrl; |
| 1050 | let api_key_openai; | 1050 | let apiKey; |
| 1051 | let headers; | 1051 | let headers; |
| 1052 | | 1052 | |
| 1053 | if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.OPENAI) { | 1053 | if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.OPENAI) { |
| 1054 | api_url = new URL(request.body.reverse_proxy || API_OPENAI).toString(); | 1054 | apiUrl = new URL(request.body.reverse_proxy || API_OPENAI).toString(); |
| 1055 | api_key_openai = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.OPENAI); | 1055 | apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.OPENAI); |
| 1056 | headers = {}; | 1056 | headers = {}; |
| 1057 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.OPENROUTER) { | 1057 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.OPENROUTER) { |
| 1058 | api_url = 'https://openrouter.ai/api/v1'; | 1058 | apiUrl = 'https://openrouter.ai/api/v1'; |
| 1059 | api_key_openai = readSecret(request.user.directories, SECRET_KEYS.OPENROUTER); | 1059 | apiKey = readSecret(request.user.directories, SECRET_KEYS.OPENROUTER); |
| 1060 | // OpenRouter needs to pass the Referer and X-Title: https://openrouter.ai/docs#requests | 1060 | // OpenRouter needs to pass the Referer and X-Title: https://openrouter.ai/docs#requests |
| 1061 | headers = { ...OPENROUTER_HEADERS }; | 1061 | headers = { ...OPENROUTER_HEADERS }; |
| 1062 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.MISTRALAI) { | 1062 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.MISTRALAI) { |
| 1063 | api_url = new URL(request.body.reverse_proxy || API_MISTRAL).toString(); | 1063 | apiUrl = new URL(request.body.reverse_proxy || API_MISTRAL).toString(); |
| 1064 | api_key_openai = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MISTRALAI); | 1064 | apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MISTRALAI); |
| 1065 | headers = {}; | 1065 | headers = {}; |
| 1066 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.CUSTOM) { | 1066 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.CUSTOM) { |
| 1067 | api_url = request.body.custom_url; | 1067 | apiUrl = request.body.custom_url; |
| 1068 | api_key_openai = readSecret(request.user.directories, SECRET_KEYS.CUSTOM); | 1068 | apiKey = readSecret(request.user.directories, SECRET_KEYS.CUSTOM); |
| 1069 | headers = {}; | 1069 | headers = {}; |
| 1070 | mergeObjectWithYaml(headers, request.body.custom_include_headers); | 1070 | mergeObjectWithYaml(headers, request.body.custom_include_headers); |
| 1071 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.COHERE) { | 1071 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.COHERE) { |
| 1072 | api_url = API_COHERE_V1; | 1072 | apiUrl = API_COHERE_V1; |
| 1073 | api_key_openai = readSecret(request.user.directories, SECRET_KEYS.COHERE); | 1073 | apiKey = readSecret(request.user.directories, SECRET_KEYS.COHERE); |
| 1074 | headers = {}; | 1074 | headers = {}; |
| 1075 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.ZEROONEAI) { | 1075 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.ZEROONEAI) { |
| 1076 | api_url = API_01AI; | 1076 | apiUrl = API_01AI; |
| 1077 | api_key_openai = readSecret(request.user.directories, SECRET_KEYS.ZEROONEAI); | 1077 | apiKey = readSecret(request.user.directories, SECRET_KEYS.ZEROONEAI); |
| 1078 | headers = {}; | 1078 | headers = {}; |
| 1079 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.NANOGPT) { | 1079 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.NANOGPT) { |
| 1080 | api_url = API_NANOGPT; | 1080 | apiUrl = API_NANOGPT; |
| 1081 | api_key_openai = readSecret(request.user.directories, SECRET_KEYS.NANOGPT); | 1081 | apiKey = readSecret(request.user.directories, SECRET_KEYS.NANOGPT); |
| 1082 | headers = {}; | 1082 | headers = {}; |
| 1083 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.DEEPSEEK) { | 1083 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.DEEPSEEK) { |
| 1084 | api_url = new URL(request.body.reverse_proxy || API_DEEPSEEK.replace('/beta', '')); | 1084 | apiUrl = new URL(request.body.reverse_proxy || API_DEEPSEEK.replace('/beta', '')); |
| 1085 | api_key_openai = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.DEEPSEEK); | 1085 | apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.DEEPSEEK); |
| 1086 | headers = {}; | 1086 | headers = {}; |
| 1087 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.XAI) { | 1087 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.XAI) { |
| 1088 | api_url = new URL(request.body.reverse_proxy || API_XAI); | 1088 | apiUrl = new URL(request.body.reverse_proxy || API_XAI); |
| 1089 | api_key_openai = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.XAI); | 1089 | apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.XAI); |
| 1090 | headers = {}; | 1090 | headers = {}; |
| 1091 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.POLLINATIONS) { | 1091 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.POLLINATIONS) { |
| 1092 | api_url = 'https://text.pollinations.ai'; | 1092 | apiUrl = 'https://text.pollinations.ai'; |
| 1093 | api_key_openai = 'NONE'; | 1093 | apiKey = 'NONE'; |
| 1094 | headers = {}; | 1094 | headers = {}; |
| 1095 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.MAKERSUITE) { | 1095 | } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.MAKERSUITE) { |
| 1096 | // For Google AI Studio, we need to get models from the API | 1096 | apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MAKERSUITE); |
| 1097 | const api_key_makersuite = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MAKERSUITE); | 1097 | apiUrl = new URL(request.body.reverse_proxy || API_MAKERSUITE); |
| 1098 | const api_url = new URL(request.body.reverse_proxy || API_MAKERSUITE); | | |
| 1099 | const apiVersion = getConfigValue('gemini.apiVersion', 'v1beta'); | 1098 | const apiVersion = getConfigValue('gemini.apiVersion', 'v1beta'); |
| 1100 | let models_url = `${api_url.origin}/${apiVersion}/models?key=${api_key_makersuite}`; | 1099 | const modelsUrl = !apiKey && request.body.reverse_proxy |
| | 1100 | ? `${apiUrl.origin}/${apiVersion}/models` |
| | 1101 | : `${apiUrl.origin}/${apiVersion}/models?key=${apiKey}`; |
| 1101 | | 1102 | |
| 1102 | if (!api_key_makersuite && request.body.reverse_proxy) { | 1103 | if (!apiKey && !request.body.reverse_proxy) { |
| 1103 | models_url = `${api_url.origin}/${apiVersion}/models`; // For some special reverse proxy, we can't pass the API key | | |
| 1104 | } else if (!api_key_makersuite && !request.body.reverse_proxy) { | | |
| 1105 | console.warn('Google AI Studio API key is missing.'); | 1104 | console.warn('Google AI Studio API key is missing.'); |
| 1106 | return response_getstatus_openai.status(400).send({ error: true }); | 1105 | return statusResponse.status(400).send({ error: true }); |
| 1107 | } | 1106 | } |
| 1108 | | 1107 | |
| 1109 | try { | 1108 | try { |
| 1110 | const response = await fetch(models_url, { | 1109 | const response = await fetch(modelsUrl); |
| 1111 | method: 'GET', | | |
| 1112 | headers: { | | |
| 1113 | 'Content-Type': 'application/json', | | |
| 1114 | }, | | |
| 1115 | }); | | |
| 1116 | | 1110 | |
| 1117 | if (response.ok) { | 1111 | if (response.ok) { |
| 1118 | /** @type {any} */ | 1112 | /** @type {any} */ |