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