centralize LiteLLM admin headers

This commit is contained in:
Daniel 2026-05-08 06:08:46 +02:00
parent 48ee92fc5d
commit b40941e4d5

View file

@ -408,9 +408,7 @@ router.get('/config/image-models/discover', async function(req, res) {
var axios = require('axios');
var discovered = [];
if (process.env.LITELLM_API_BASE) {
var headers = {};
if (process.env.LITELLM_API_KEY) headers.Authorization = 'Bearer ' + process.env.LITELLM_API_KEY;
var resp = await axios.get(gatewayUrl('/models'), { headers: headers, timeout: 15000 });
var resp = await axios.get(gatewayUrl('/models'), { headers: getLiteLLMHeaders(), timeout: 15000 });
var models = (resp.data && resp.data.data) || [];
models.forEach(function(m) {
var id = m.id || '';
@ -438,14 +436,12 @@ router.post('/config/image-models/test', async function(req, res) {
var modelId = String(req.body.modelId || '').trim();
if (!modelId) return res.status(400).json({ error: 'modelId required' });
var axios = require('axios');
var headers = { 'Content-Type': 'application/json' };
if (process.env.LITELLM_API_KEY) headers.Authorization = 'Bearer ' + process.env.LITELLM_API_KEY;
var started = Date.now();
var imgResp = await axios.post(gatewayUrl('/images/generations'), {
model: modelId,
prompt: 'A simple child-friendly icon of lungs and an inhaler, flat medical illustration, no text',
size: '1024x1024'
}, { headers: headers, timeout: 120000 });
}, { headers: getLiteLLMHeaders('application/json'), timeout: 120000 });
var item = imgResp.data && imgResp.data.data && imgResp.data.data[0] ? imgResp.data.data[0] : {};
res.json({
success: true,
@ -682,10 +678,8 @@ router.get('/config/stt/discover', async function(req, res) {
if (provider === 'litellm' && process.env.LITELLM_API_BASE) {
// base URL handled by gatewayUrl() helper
var sHeaders = {};
if (process.env.LITELLM_API_KEY) sHeaders['Authorization'] = 'Bearer ' + process.env.LITELLM_API_KEY;
try {
var sResp = await axios.get(gatewayUrl('/models'), { headers: sHeaders, timeout: 10000 });
var sResp = await axios.get(gatewayUrl('/models'), { headers: getLiteLLMHeaders(), timeout: 10000 });
if (sResp.data && sResp.data.data) {
sResp.data.data.forEach(function(m) {
var mid = (m.id || '').toLowerCase();
@ -756,22 +750,18 @@ router.post('/config/stt/test', async function(req, res) {
var form = new FormData();
form.append('file', file);
form.append('model', sttModel);
var fetchHeaders = {};
if (process.env.LITELLM_API_KEY) fetchHeaders['Authorization'] = 'Bearer ' + process.env.LITELLM_API_KEY;
var sttResp = await fetch(gatewayUrl('/audio/transcriptions'), {
method: 'POST', headers: fetchHeaders, body: form
method: 'POST', headers: getLiteLLMHeaders(), body: form
}).then(function(r) { return r.json().then(function(d) { return { data: d }; }); });
text = sttResp.data && sttResp.data.text ? sttResp.data.text : '';
} else {
var headers = { 'Content-Type': 'application/json' };
if (process.env.LITELLM_API_KEY) headers['Authorization'] = 'Bearer ' + process.env.LITELLM_API_KEY;
var sttResp = await axios.post(gatewayUrl('/chat/completions'), {
model: sttModel,
messages: [{ role: 'user', content: [
{ type: 'input_audio', input_audio: { data: audioBase64, format: mime.split('/')[1] || 'webm' } },
{ type: 'text', text: 'Transcribe this audio. Output the spoken words only.' }
]}]
}, { headers: headers, timeout: 60000 });
}, { headers: getLiteLLMHeaders('application/json'), timeout: 60000 });
if (sttResp.data && sttResp.data.choices && sttResp.data.choices[0]) {
text = (sttResp.data.choices[0].message && sttResp.data.choices[0].message.content) || '';
}
@ -849,10 +839,8 @@ router.get('/config/embeddings/discover', async function(req, res) {
if (provider === 'litellm') {
// base URL handled by gatewayUrl() helper
var eHeaders = {};
if (process.env.LITELLM_API_KEY) eHeaders['Authorization'] = 'Bearer ' + process.env.LITELLM_API_KEY;
try {
var eResp = await axios.get(gatewayUrl('/models'), { headers: eHeaders, timeout: 10000 });
var eResp = await axios.get(gatewayUrl('/models'), { headers: getLiteLLMHeaders(), timeout: 10000 });
if (eResp.data && eResp.data.data) {
eResp.data.data.forEach(function(m) {
if ((m.id || '').toLowerCase().indexOf('embed') !== -1) {