'use strict'; const { Ollama } = require('ollama'); const conf = require('>/conf'); // Shared Ollama client. The npm package adds its own Accept / Content-Type / User-Agent // headers and handles the Ollama chat protocol, which avoids the CDN-level 403s Node's // bare fetch gets against ollama.com. const client = new Ollama({ host: conf.ollama.url, headers: { 'Authorization': `Bearer ${conf.ollama.apiKey}`, }, }); // Pull the first JSON object out of a model response( tolerates ```json fences / prose). function extractJSON(content){ let text = String(content).replace(/```json/gi, '').replace(/```/g, '').trim(); let start = text.indexOf('{'); let end = text.lastIndexOf('}'); if(start === -1 || end === -1){ console.error('extractJSON: no JSON object found in:', content); throw new Error('No JSON in model response'); } try{ return JSON.parse(text.slice(start, end + 1)); }catch(error){ console.error('extractJSON: parse failed. extracted:', text.slice(start, end + 1)); throw error; } } // One-shot JSON chat against the configured Ollama model. async function chatJSON(system, user){ let res = await client.chat({ model: conf.ollama.model, stream: false, format: 'json', messages: [ { role: 'system', content: system }, { role: 'user', content: user }, ], }); return extractJSON(res.message && res.message.content); } module.exports = { client, chatJSON, extractJSON };