Remember Studio 2 LoRA stacks for each engine
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import {reactive,watch} from 'vue'
|
||||
import {inferLoraUse,filterLorasForUse,filterLorasForStudio,filterLoraStackForUse} from '../utils/loras.ts'
|
||||
import {createLoraMemory,loraUse} from '../shared/studio2/lora-memory.mjs'
|
||||
import {restoreAll,restoreAsset,bindClip,extendSelected,useAsHero,useAsSource} from '../shared/studio2/input.mjs'
|
||||
const stack=name=>[{name:name+'.safetensors',strengthModel:.6,strengthClip:.35}]
|
||||
|
||||
test('engine token matrix uses paths and names, omits unknown and system picker entries',()=>{
|
||||
const cases={'xaigen-klein_car':'flux','klein/style':'flux','XAIgen-flux_test':'flux','Flux2-Klein/test':'flux','MiniMax/car':'minimax','folder/LTX_style':'ltx','xiagen-Krea_look':'krea','xaigen-krea/style':'krea','unlabelled':null}
|
||||
for(const [name,use] of Object.entries(cases)) {
|
||||
assert.deepEqual(inferLoraUse(name+'.safetensors'),use?[use]:null)
|
||||
for(const current of ['flux','krea','minimax','ltx']) assert.equal(filterLorasForUse([name+'.safetensors'],current).length,use===current?1:0)
|
||||
}
|
||||
const restricted=['xaigen-klein.safetensors','XAIgen-MiniMax.safetensors','xiagen-Krea.safetensors']
|
||||
assert.deepEqual(filterLorasForStudio(restricted,false),[])
|
||||
assert.deepEqual(filterLoraStackForUse(stack('xaigen-klein'),'flux',false),[])
|
||||
assert.deepEqual(filterLoraStackForUse(stack('LTX'),'ltx',false),[])
|
||||
for(const [name,use] of [['minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16','minimax'],['ltx-2.3-22b-distilled','ltx'],['Flux2-Klein-9B-consistency-V2','flux']]) assert.deepEqual(filterLorasForUse([name+'.safetensors'],use),[])
|
||||
assert.deepEqual(filterLoraStackForUse(stack('unlabelled'),'flux',true),stack('unlabelled'))
|
||||
})
|
||||
|
||||
function bench() {
|
||||
const data=new Map(),storage={getItem:k=>data.get(k),setItem:(k,v)=>data.set(k,v)}
|
||||
const memory=createLoraMemory(true,storage)
|
||||
const form=reactive({mode:'generate',engine:'flux',settings:{loraStack:[]}})
|
||||
const stop=watch(()=>[loraUse(form),form.settings.loraStack],()=>memory.sync(form),{deep:true,flush:'sync'})
|
||||
memory.sync(form)
|
||||
return {form,memory,storage,stop}
|
||||
}
|
||||
test('reactive task switches remember four independent stacks and both strengths',()=>{
|
||||
const {form,memory,storage,stop}=bench()
|
||||
form.settings.loraStack=stack('klein_car_bee')
|
||||
form.settings.loraStack[0].strengthClip=.8
|
||||
form.mode='video';form.engine='minimax'
|
||||
assert.deepEqual(form.settings.loraStack,[])
|
||||
form.settings.loraStack=stack('MiniMax_style')
|
||||
form.engine='ltx';assert.deepEqual(form.settings.loraStack,[])
|
||||
form.settings.loraStack=stack('LTX_style')
|
||||
form.mode='edit';form.engine='flux'
|
||||
assert.equal(form.settings.loraStack[0].name,'klein_car_bee.safetensors')
|
||||
assert.equal(form.settings.loraStack[0].strengthClip,.8)
|
||||
form.engine='krea';assert.deepEqual(form.settings.loraStack,[])
|
||||
form.settings.loraStack=stack('Krea_style')
|
||||
form.mode='video';form.engine='minimax'
|
||||
assert.deepEqual(form.settings.loraStack,stack('MiniMax_style'))
|
||||
Object.assign(form,useAsHero(form,{id:'image'}),useAsSource(form,{id:'source'}))
|
||||
assert.deepEqual(form.settings.loraStack,stack('MiniMax_style'))
|
||||
const fresh=createLoraMemory(true,storage),other={mode:'generate',engine:'krea',settings:{loraStack:[]}}
|
||||
fresh.sync(other);assert.deepEqual(other.settings.loraStack,stack('Krea_style'))
|
||||
stop()
|
||||
})
|
||||
test('Use as input and Extend copy saved stacks, filter wrong engines, and fall back only when saved empty',()=>{
|
||||
const {form,memory,stop}=bench()
|
||||
form.settings.loraStack=stack('klein_remembered')
|
||||
const still={id:'still',kind:'still',studio2:{engine:'flux',mode:'edit',settings:{loraStack:[...stack('klein_saved'),...stack('MiniMax_wrong')]}}}
|
||||
Object.assign(form,restoreAll(form,still,true,memory))
|
||||
assert.deepEqual(form.settings.loraStack,stack('klein_saved'))
|
||||
const clip={id:'clip',kind:'clip',studio2:{engine:'minimax',settings:{loraStack:[...stack('MiniMax_saved'),...stack('klein_wrong')]}}}
|
||||
Object.assign(form,extendSelected(form,clip,true,memory))
|
||||
assert.deepEqual(form.settings.loraStack,stack('MiniMax_saved'))
|
||||
Object.assign(form,restoreAll(form,{...still,studio2:{...still.studio2,settings:{loraStack:[]}}},true,memory))
|
||||
assert.deepEqual(form.settings.loraStack,stack('klein_saved'))
|
||||
Object.assign(form,bindClip(form,{id:'empty',settings:{loraStack:[]}},true,memory))
|
||||
assert.deepEqual(form.settings.loraStack,stack('MiniMax_saved'))
|
||||
const legacy=restoreAsset(form,{id:'old-still',kind:'still',engine:'krea',settings:{loraStack:stack('Krea_saved')}},true,memory)
|
||||
assert.equal(legacy.engine,'krea');assert.deepEqual(legacy.settings.loraStack,stack('Krea_saved'))
|
||||
stop()
|
||||
})
|
||||
Reference in New Issue
Block a user