llamacpp: use generic CC endpoint for captioning

8a4da487dd0d74316ae18b4fae63c4013c3426cb

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

3 files changed, +7 -49Showing whitespace changes
public/scripts/extensions/shared.js+0 -2
@@ -97,8 +97,6 @@ export async function getMultimodalCaption(base64Img, prompt) {
9797 return '/api/google/caption-image';
9898 case 'anthropic':
9999 return '/api/anthropic/caption-image';
100- case 'llamacpp':
101- return '/api/backends/text-completions/llamacpp/caption-image';
102100 case 'ollama':
103101 return '/api/backends/text-completions/ollama/caption-image';
104102 default:
src/endpoints/backends/text-completions.js+0 -45
@@ -502,51 +502,6 @@ ollama.post('/caption-image', async function (request, response) {
502502
503503const llamacpp = express.Router();
504504
505-llamacpp.post('/caption-image', async function (request, response) {
506- try {
507- if (!request.body.server_url) {
508- return response.sendStatus(400);
509- }
510-
511- console.debug('LlamaCpp caption request:', request.body);
512- const baseUrl = trimV1(request.body.server_url);
513-
514- const fetchResponse = await fetch(`${baseUrl}/completion`, {
515- method: 'POST',
516- headers: { 'Content-Type': 'application/json' },
517- body: JSON.stringify({
518- prompt: `USER:[img-1]${String(request.body.prompt).trim()}\nASSISTANT:`,
519- image_data: [{ data: request.body.image, id: 1 }],
520- temperature: 0.1,
521- stream: false,
522- stop: ['USER:', '</s>'],
523- }),
524- });
525-
526- if (!fetchResponse.ok) {
527- console.error('LlamaCpp caption error:', fetchResponse.status, fetchResponse.statusText);
528- return response.status(500).send({ error: true });
529- }
530-
531- /** @type {any} */
532- const data = await fetchResponse.json();
533- console.debug('LlamaCpp caption response:', data);
534-
535- const caption = data?.content || '';
536-
537- if (!caption) {
538- console.error('LlamaCpp caption is empty.');
539- return response.status(500).send({ error: true });
540- }
541-
542- return response.send({ caption });
543-
544- } catch (error) {
545- console.error(error);
546- return response.sendStatus(500);
547- }
548-});
549-
550505llamacpp.post('/props', async function (request, response) {
551506 try {
552507 if (!request.body.server_url) {
src/endpoints/openai.js+7 -2
@@ -45,6 +45,10 @@ router.post('/caption-image', async (request, response) => {
4545 key = readSecret(request.user.directories, SECRET_KEYS.KOBOLDCPP);
4646 }
4747
48+ if (request.body.api === 'llamacpp') {
49+ key = readSecret(request.user.directories, SECRET_KEYS.LLAMACPP);
50+ }
51+
4852 if (request.body.api === 'vllm') {
4953 key = readSecret(request.user.directories, SECRET_KEYS.VLLM);
5054 }
@@ -69,7 +73,8 @@ router.post('/caption-image', async (request, response) => {
6973 key = readSecret(request.user.directories, SECRET_KEYS.XAI);
7074 }
7175
7276 if (!key &&const !request.body.reverse_proxynoKeyTypes &&= ['custom', 'ooba', 'koboldcpp', 'vllm'].includes(request.body.api) === false), {'llamacpp'];
77+ if (!key && !request.body.reverse_proxy && !noKeyTypes.includes(request.body.api)) {
7378 console.warn('No key found for API', request.body.api);
7479 return response.sendStatus(400);
7580 }
@@ -156,7 +161,7 @@ router.post('/caption-image', async (request, response) => {
156161 });
157162 }
158163
159164 if (request.body.api === ['koboldcpp', ||'vllm', 'llamacpp'].includes(request.body.api === 'vllm')) {
160165 apiUrl = `${trimV1(request.body.server_url)}/v1/chat/completions`;
161166 }
162167