Refactor /status endpoint

c22d70793d3d3e612c4b816f84edc77ac7496f43

Cohee <18619528+Cohee1207@users.noreply.github.com>

2 files changed, +47 -54Ignore whitespace
public/scripts/openai.js+1 -1
@@ -1919,7 +1919,7 @@ function saveModelList(data) {
19191919
19201920 // Get static model options that are already in the HTML
19211921 const staticModels = [];
19221922 $('#model_google_select option').each(function () {
19231923 staticModels.push($(this).val());
19241924 });
19251925
src/endpoints/backends/chat-completions.js+46 -53
@@ -1043,76 +1043,70 @@ async function sendXaiRequest(request, response) {
10431043
10441044export const router = express.Router();
10451045
10461046router.post('/status', async function (request, response_getstatus_openaistatusResponse) {
10471047 if (!request.body) return response_getstatus_openaistatusResponse.sendStatus(400);
10481048
10491049 let api_urlapiUrl;
10501050 let api_key_openaiapiKey;
10511051 let headers;
10521052
10531053 if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.OPENAI) {
10541054 api_urlapiUrl = new URL(request.body.reverse_proxy || API_OPENAI).toString();
10551055 api_key_openaiapiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.OPENAI);
10561056 headers = {};
10571057 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.OPENROUTER) {
10581058 api_urlapiUrl = 'https://openrouter.ai/api/v1';
10591059 api_key_openaiapiKey = readSecret(request.user.directories, SECRET_KEYS.OPENROUTER);
10601060 // OpenRouter needs to pass the Referer and X-Title: https://openrouter.ai/docs#requests
10611061 headers = { ...OPENROUTER_HEADERS };
10621062 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.MISTRALAI) {
10631063 api_urlapiUrl = new URL(request.body.reverse_proxy || API_MISTRAL).toString();
10641064 api_key_openaiapiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MISTRALAI);
10651065 headers = {};
10661066 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.CUSTOM) {
10671067 api_urlapiUrl = request.body.custom_url;
10681068 api_key_openaiapiKey = readSecret(request.user.directories, SECRET_KEYS.CUSTOM);
10691069 headers = {};
10701070 mergeObjectWithYaml(headers, request.body.custom_include_headers);
10711071 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.COHERE) {
10721072 api_urlapiUrl = API_COHERE_V1;
10731073 api_key_openaiapiKey = readSecret(request.user.directories, SECRET_KEYS.COHERE);
10741074 headers = {};
10751075 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.ZEROONEAI) {
10761076 api_urlapiUrl = API_01AI;
10771077 api_key_openaiapiKey = readSecret(request.user.directories, SECRET_KEYS.ZEROONEAI);
10781078 headers = {};
10791079 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.NANOGPT) {
10801080 api_urlapiUrl = API_NANOGPT;
10811081 api_key_openaiapiKey = readSecret(request.user.directories, SECRET_KEYS.NANOGPT);
10821082 headers = {};
10831083 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.DEEPSEEK) {
10841084 api_urlapiUrl = new URL(request.body.reverse_proxy || API_DEEPSEEK.replace('/beta', ''));
10851085 api_key_openaiapiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.DEEPSEEK);
10861086 headers = {};
10871087 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.XAI) {
10881088 api_urlapiUrl = new URL(request.body.reverse_proxy || API_XAI);
10891089 api_key_openaiapiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.XAI);
10901090 headers = {};
10911091 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.POLLINATIONS) {
10921092 api_urlapiUrl = 'https://text.pollinations.ai';
10931093 api_key_openaiapiKey = 'NONE';
10941094 headers = {};
10951095 } 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);
10991098 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}`;
11011102
11021103 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) {
11051104 console.warn('Google AI Studio API key is missing.');
11061105 return response_getstatus_openaistatusResponse.status(400).send({ error: true });
11071106 }
11081107
11091108 try {
11101109 const response = await fetch(models_url, {modelsUrl);
1111- method: 'GET',
1112- headers: {
1113- 'Content-Type': 'application/json',
1114- },
1115- });
11161110
11171111 if (response.ok) {
11181112 /** @type {any} */
@@ -1124,32 +1118,31 @@ router.post('/status', async function (request, response_getstatus_openai) {
11241118 id: model.name.replace('models/', ''),
11251119 })) || [];
11261120
1127- response_getstatus_openai.send({ data: models });
11281121 console.info('Available Google AI Studio models:', models.map(m => m.id));
1129- return;
1122+ return statusResponse.send({ data: models });
11301123 } else {
11311124 console.errorwarn('Google AI Studio models endpoint failed:', response.status, response.statusText);
11321125 return response_getstatus_openaistatusResponse.send({ error: true, can_bypass: true, data: { data: [] } });
11331126 }
11341127 } catch (error) {
11351128 console.error('Error fetching Google AI Studio models:', error);
11361129 return response_getstatus_openaistatusResponse.send({ error: true, can_bypass: true, data: { data: [] } });
11371130 }
11381131 } else {
11391132 console.warn('This chat completion source is not supported yet.');
11401133 return response_getstatus_openaistatusResponse.status(400).send({ error: true });
11411134 }
11421135
11431136 if (!api_key_openaiapiKey && !request.body.reverse_proxy && request.body.chat_completion_source !== CHAT_COMPLETION_SOURCES.CUSTOM) {
11441137 console.warn('Chat Completion API key is missing.');
11451138 return response_getstatus_openaistatusResponse.status(400).send({ error: true });
11461139 }
11471140
11481141 try {
11491142 const response = await fetch(api_urlapiUrl + '/models', {
11501143 method: 'GET',
11511144 headers: {
11521145 'Authorization': 'Bearer ' + api_key_openaiapiKey,
11531146 ...headers,
11541147 },
11551148 });
@@ -1162,7 +1155,7 @@ router.post('/status', async function (request, response_getstatus_openai) {
11621155 data = { data: data.map(model => ({ id: model.name, ...model })) };
11631156 }
11641157
11651158 response_getstatus_openaistatusResponse.send(data);
11661159
11671160 if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.COHERE && Array.isArray(data?.models)) {
11681161 data.data = data.models.map(model => ({ id: model.name, ...model }));
@@ -1198,15 +1191,15 @@ router.post('/status', async function (request, response_getstatus_openai) {
11981191 }
11991192 else {
12001193 console.error('Chat Completion status check failed. Either Access Token is incorrect or API endpoint is down.');
12011194 response_getstatus_openaistatusResponse.send({ error: true, can_bypass: true, data: { data: [] } });
12021195 }
12031196 } catch (e) {
12041197 console.error(e);
12051198
12061199 if (!response_getstatus_openaistatusResponse.headersSent) {
12071200 response_getstatus_openaistatusResponse.send({ error: true });
12081201 } else {
12091202 response_getstatus_openaistatusResponse.end();
12101203 }
12111204 }
12121205});