* docs: prepare Vendoo 1.41.2 git-ignore boundary hotfix * fix: track native source modules with root-anchored runtime ignores
65 lines
2.1 KiB
JavaScript
65 lines
2.1 KiB
JavaScript
export const MODELS = [
|
|
{ id: 'llama3.2-vision', name: 'Llama 3.2 Vision (11B)' },
|
|
{ id: 'llava', name: 'LLaVA 1.6 (7B)' },
|
|
{ id: 'moondream', name: 'Moondream 2 (1.8B, schnell)' },
|
|
{ id: 'gemma3', name: 'Gemma 3 (Vision)' },
|
|
];
|
|
|
|
export async function generate(images, systemPrompt, model) {
|
|
const baseUrl = process.env.OLLAMA_URL || 'http://localhost:11434';
|
|
const modelId = model || MODELS[0].id;
|
|
|
|
const ollamaImages = images.map(img => img.base64);
|
|
|
|
const res = await fetch(`${baseUrl}/api/chat`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
model: modelId,
|
|
stream: false,
|
|
messages: [
|
|
{ role: 'system', content: systemPrompt },
|
|
{
|
|
role: 'user',
|
|
content: 'Analysiere die Fotos und erstelle das Listing gemäß den Anweisungen. Antworte ausschließlich mit validem JSON.',
|
|
images: ollamaImages,
|
|
},
|
|
],
|
|
}),
|
|
});
|
|
|
|
if (!res.ok) {
|
|
const text = await res.text().catch(() => '');
|
|
throw new Error(`Ollama Fehler (${res.status}): ${text.slice(0, 200)}`);
|
|
}
|
|
|
|
const data = await res.json();
|
|
const text = data.message.content;
|
|
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
if (!jsonMatch) throw new Error('AI returned no valid JSON');
|
|
return JSON.parse(jsonMatch[0]);
|
|
}
|
|
|
|
export async function generateText(systemPrompt, userPrompt, model) {
|
|
const baseUrl = process.env.OLLAMA_URL || 'http://localhost:11434';
|
|
const modelId = model || MODELS[0].id;
|
|
const res = await fetch(`${baseUrl}/api/chat`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
model: modelId,
|
|
stream: false,
|
|
messages: [
|
|
{ role: 'system', content: String(systemPrompt || '') },
|
|
{ role: 'user', content: String(userPrompt || '') },
|
|
],
|
|
}),
|
|
});
|
|
if (!res.ok) {
|
|
const text = await res.text().catch(() => '');
|
|
throw new Error(`Ollama Fehler (${res.status}): ${text.slice(0, 200)}`);
|
|
}
|
|
const data = await res.json();
|
|
return String(data.message?.content || '').trim();
|
|
}
|