@@ -25,16 +25,76 @@ return'https://queue.fal.run';
2525}
2626_getModelId ( role ) {
2727var map = {
28- t2i :{ id : 'falaiModelT2I' , fallback : 'fal-ai/flux/schnell' } ,
29- i2i :{ id : 'falaiModelI2I' , fallback : 'fal-ai/image-to-image' } ,
30- upscale :{ id : 'falaiModelUpscale' , fallback : 'fal-ai/creative-upscaler' } ,
31- rembg :{ id : 'falaiModelRembg' , fallback : 'fal-ai/birefnet' }
28+ t2i :'falaiModelT2I' ,
29+ i2i :'falaiModelI2I' ,
30+ upscale :'falaiModelUpscale' ,
31+ rembg :'falaiModelRembg'
3232} ;
33- var entry = map [ role ] ;
34- if ( ! entry ) return '' ;
35- var el = $ ( entry . id ) ;
36- var val = el ?el . value . trim ( ) :'' ;
37- return val || entry . fallback ;
33+ var id = map [ role ] ;
34+ if ( ! id ) return '' ;
35+ var el = $ ( id ) ;
36+ return el ?el . value :'' ;
37+ }
38+ async fetchModels ( ) {
39+ var apiKey = this . getApiKey ( ) ;
40+ if ( ! apiKey ) {
41+ this . _enableSelects ( false ) ;
42+ return ;
43+ }
44+ var queries = {
45+ falaiModelT2I :'category=text-to-image&status=active&limit=50' ,
46+ falaiModelI2I :'category=image-to-image&status=active&limit=50' ,
47+ falaiModelUpscale :'q=upscale&status=active&limit=50' ,
48+ falaiModelRembg :'q=background+removal&status=active&limit=50'
49+ } ;
50+ var headers = {
51+ 'Authorization' :'Key ' + apiKey
52+ } ;
53+ var entries = Object . entries ( queries ) ;
54+ var results = await Promise . allSettled ( entries . map ( function ( entry ) {
55+ return fetch ( 'https://api.fal.ai/v1/models?' + entry [ 1 ] , { headers :headers } ) . then ( function ( r ) {
56+ if ( ! r . ok ) throw new Error ( r . status + '' ) ;
57+ return r . json ( ) ;
58+ } ) ;
59+ } ) ) ;
60+ for ( var i = 0 ; i < entries . length ; i ++ ) {
61+ var selectId = entries [ i ] [ 0 ] ;
62+ var result = results [ i ] ;
63+ if ( result . status === 'fulfilled' && result . value && result . value . models ) {
64+ this . _populateSelect ( selectId , result . value . models ) ;
65+ } else {
66+ this . _populateSelect ( selectId , [ ] ) ;
67+ }
68+ }
69+ }
70+ _enableSelects ( enabled ) {
71+ var labels = { falaiModelT2I :'T2I' , falaiModelI2I :'I2I' , falaiModelUpscale :'Upscale' , falaiModelRembg :'RemoveBG' } ;
72+ var ids = Object . keys ( labels ) ;
73+ for ( var i = 0 ; i < ids . length ; i ++ ) {
74+ var el = $ ( ids [ i ] ) ;
75+ if ( ! el ) continue ;
76+ el . disabled = ! enabled ;
77+ if ( ! enabled ) {
78+ el . innerHTML = '<option value="">' + labels [ ids [ i ] ] + '</option>' ;
79+ }
80+ }
81+ }
82+ _populateSelect ( selectId , models ) {
83+ var el = $ ( selectId ) ;
84+ if ( ! el ) return ;
85+ var prev = el . value ;
86+ el . innerHTML = '<option value="">-- select --</option>' ;
87+ for ( var i = 0 ; i < models . length ; i ++ ) {
88+ var m = models [ i ] ;
89+ var opt = document . createElement ( 'option' ) ;
90+ opt . value = m . endpoint_id || '' ;
91+ opt . textContent = m . metadata && m . metadata . display_name ?m . metadata . display_name :m . endpoint_id ;
92+ el . appendChild ( opt ) ;
93+ }
94+ if ( prev ) {
95+ el . value = prev ;
96+ }
97+ el . disabled = false ;
3898}
3999_authHeaders ( ) {
40100var apiKey = this . getApiKey ( ) ;
@@ -238,7 +298,11 @@ removeSpinner(spinnerId);
238298}
239299async executeT2I ( layer , spinnerId ) {
240300var modelId = this . _getModelId ( 't2i' ) ;
241- var self = this ;
301+ if ( ! modelId ) {
302+ removeSpinner ( spinnerId ) ;
303+ createToastError ( 'Fal.ai' , 'T2I model not selected' , 5000 ) ;
304+ return ;
305+ }
242306return this . _execute ( layer , spinnerId , 'T2I' , modelId , ( ) => {
243307var rd = baseRequestData ( layer ) ;
244308if ( basePrompt . text2img_model != '' ) {
@@ -256,6 +320,11 @@ seed:rd.seed>0?rd.seed:undefined
256320}
257321async executeI2I ( layer , spinnerId ) {
258322var modelId = this . _getModelId ( 'i2i' ) ;
323+ if ( ! modelId ) {
324+ removeSpinner ( spinnerId ) ;
325+ createToastError ( 'Fal.ai' , 'I2I model not selected' , 5000 ) ;
326+ return ;
327+ }
259328return this . _execute ( layer , spinnerId , 'I2I' , modelId , ( ) => {
260329var rd = baseRequestData ( layer ) ;
261330var base64Image = imageObject2Base64ImageEffectKeep ( layer ) ;
@@ -273,6 +342,11 @@ seed:rd.seed>0?rd.seed:undefined
273342}
274343async executeUpscale ( layer , spinnerId ) {
275344var modelId = this . _getModelId ( 'upscale' ) ;
345+ if ( ! modelId ) {
346+ removeSpinner ( spinnerId ) ;
347+ createToastError ( 'Fal.ai' , 'Upscale model not selected' , 5000 ) ;
348+ return ;
349+ }
276350return this . _execute ( layer , spinnerId , 'Upscaler' , modelId , ( ) => {
277351var base64Image = imageObject2Base64ImageEffectKeep ( layer ) ;
278352return {
@@ -282,6 +356,11 @@ image_url:base64Image
282356}
283357async executeRembg ( layer , spinnerId ) {
284358var modelId = this . _getModelId ( 'rembg' ) ;
359+ if ( ! modelId ) {
360+ removeSpinner ( spinnerId ) ;
361+ createToastError ( 'Fal.ai' , 'RemoveBG model not selected' , 5000 ) ;
362+ return ;
363+ }
285364return this . _execute ( layer , spinnerId , 'Rembg' , modelId , ( ) => {
286365var base64Image = imageObject2Base64ImageEffectKeep ( layer ) ;
287366return {
0 commit comments