import * as fal from '@fal-ai/serverless-client'; import { html } from 'lit'; import { jpegBase64ToFile } from '../edgeless/edit-image.js'; import { createVendor, FastImage2ImageServiceKind, Image2ImageServiceKind, Text2ImageServiceKind, } from './service-base.js'; export const falVendor = createVendor<{ apiKey: string; }>({ key: 'Fal', color: '#5C4DD2', initData: () => ({ apiKey: '' }), renderConfigEditor: (data, refresh) => { return html`
`; }, }); export const createImageGenerator = (apiKey: string) => { const connection = fal.realtime.connect('110602490-lcm-sd15-i2i', { onResult: result => { const fn = requestMap.get(result.request_id); if (fn) { fn(result.images[0].url); requestMap.delete(result.request_id); } }, onError: error => { console.error(error); }, }); const requestMap = new Map void>(); let id = 0; return (prompt: string, img: string) => { return new Promise(res => { fal.config({ credentials: apiKey, }); connection.send({ request_id: `${id++}`, prompt, sync_mode: true, enable_safety_checks: false, image_url: img, }); requestMap.set(id.toString(), res); }); }; }; Image2ImageServiceKind.implService({ name: '110602490-lcm-sd15-i2i', method: ({ apiKey }) => ({ generateImage: async (prompt, image) => { const data = await fetch( 'https://110602490-lcm-sd15-i2i.gateway.alpha.fal.ai/', { method: 'post', headers: { Authorization: `key ${apiKey}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ image_url: image, prompt: prompt, sync_mode: true, seed: 42, enable_safety_checks: false, }), } ).then(res => res.json()); return data.images[0].url; }, }), vendor: falVendor, }); Text2ImageServiceKind.implService({ name: '110602490-fast-sdxl', method: ({ apiKey }) => ({ generateImage: async prompt => { fal.config({ credentials: apiKey, }); const result = (await fal.subscribe('110602490-fast-sdxl', { input: { prompt: prompt, sync_mode: true, }, })) as { images: { url: string }[] }; return jpegBase64ToFile(result.images[0].url, 'img'); }, }), vendor: falVendor, }); FastImage2ImageServiceKind.implService({ name: 'lcm-sd15-i2i', method: data => ({ createFastRequest: () => { const client = createImageGenerator(data.apiKey); return async (prompt, image) => { return client(prompt, image); }; }, }), vendor: falVendor, });