UNPKG

@just-every/ensemble

Version:

LLM provider abstraction layer with unified streaming interface

63 lines 2.56 kB
import { randomUUID } from 'node:crypto'; import { getModelFromAgent, getModelProvider } from '../model_providers/model_provider.js'; export function ensembleImage(prompt, agent, options = {}) { const run = async () => { const model = await getModelFromAgent(agent, 'image_generation'); const provider = getModelProvider(model); if (!provider.createImage) throw new Error(`Provider for model ${model} does not support image generation`); return provider.createImage(prompt, model, agent, options); }; if (!options.stream) { return run(); } const self = async function* () { const request_id = options.request_id || randomUUID(); options = { ...options, request_id }; const { costTracker } = await import('../utils/cost_tracker.js'); yield { type: 'image_start', request_id, timestamp: new Date().toISOString() }; const handler = (usage) => { if (usage?.request_id === request_id) { const ev = { type: 'cost_update', usage, request_id, timestamp: new Date().toISOString() }; iterator.push(ev); } }; const iterator = { queue: [], push(e) { this.queue.push(e); }, }; costTracker.onAddUsage(handler); try { const images = await run(); while (iterator.queue.length) yield iterator.queue.shift(); let idx = 0; for (const img of images) { const isUrl = typeof img === 'string' && /^https?:\/\//i.test(img); const ev = { type: 'file_complete', request_id, message_id: `${request_id}_img_${idx}`, data_format: isUrl ? 'url' : 'base64', data: img, timestamp: new Date().toISOString(), }; yield ev; while (iterator.queue.length) yield iterator.queue.shift(); idx++; } yield { type: 'image_complete', request_id, timestamp: new Date().toISOString() }; while (iterator.queue.length) yield iterator.queue.shift(); } catch (error) { yield { type: 'error', request_id, error: String(error?.message || error) }; } finally { costTracker.offAddUsage(handler); } }; return self(); } //# sourceMappingURL=ensemble_image.js.map