Add LoRA activation words and hide LoRAs that do not match the current engine.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+29
-2
@@ -193,12 +193,15 @@
|
||||
class="mt-3 max-w-md"
|
||||
:model-value="readLoraStack(segment)"
|
||||
:names="videoLoraOptions"
|
||||
:triggers="loraTriggers"
|
||||
label="LoRA"
|
||||
empty-label="Default"
|
||||
add-label="Add LoRA"
|
||||
compact
|
||||
:clip-strength="false"
|
||||
@update:model-value="(value) => { setSegmentStack(segment, value); saveSegment(job.shots, segment) }"
|
||||
@insert-trigger="insertSegmentTrigger(job.shots, segment, $event)"
|
||||
@update-trigger="saveLoraTrigger"
|
||||
/>
|
||||
<p v-else-if="segmentLoraLabel(job.shots, segment)" class="mt-1 text-[11px] text-zinc-500">{{ segmentLoraLabel(job.shots, segment) }}</p>
|
||||
<div v-if="segment.clipId" class="mt-2">
|
||||
@@ -335,12 +338,15 @@
|
||||
class="mt-3 max-w-md"
|
||||
:model-value="readLoraStack(segment)"
|
||||
:names="videoLoraOptions"
|
||||
:triggers="loraTriggers"
|
||||
label="LoRA"
|
||||
empty-label="Default"
|
||||
add-label="Add LoRA"
|
||||
compact
|
||||
:clip-strength="false"
|
||||
@update:model-value="(value) => { setSegmentStack(segment, value); saveSegment(queue, segment) }"
|
||||
@insert-trigger="insertSegmentTrigger(queue, segment, $event)"
|
||||
@update-trigger="saveLoraTrigger"
|
||||
/>
|
||||
<p v-else-if="segmentLoraLabel(queue, segment)" class="mt-1 text-[11px] text-zinc-500">{{ segmentLoraLabel(queue, segment) }}</p>
|
||||
<div v-if="segment.clipId" class="mt-2">
|
||||
@@ -397,7 +403,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { loraStackLabel, persistLoraFields, readLoraStack, type LoraStackItem } from '~/utils/loras'
|
||||
import { insertActivationPhrase, loraIdentityKey, loraMatchesUse, loraStackLabel, persistLoraFields, readLoraStack, type LoraStackItem } from '~/utils/loras'
|
||||
|
||||
type Segment = {
|
||||
index: number
|
||||
@@ -458,6 +464,7 @@ type PendingRemove = {
|
||||
}
|
||||
|
||||
const videoLoras = ref<string[]>([])
|
||||
const loraTriggers = ref<Record<string, string>>({})
|
||||
const jobs = ref<StudioJobRow[]>([])
|
||||
const orphans = ref<Queue[]>([])
|
||||
const waitingCount = ref(0)
|
||||
@@ -472,7 +479,7 @@ const pendingRemove = ref<PendingRemove | null>(null)
|
||||
let pollTimer: ReturnType<typeof setInterval> | null = null
|
||||
|
||||
const videoLoraOptions = computed(() => {
|
||||
const names = [...videoLoras.value]
|
||||
const names = videoLoras.value.filter(name => loraMatchesUse(name, 'minimax') || loraMatchesUse(name, 'ltx'))
|
||||
for (const queue of [...jobs.value.map(job => job.shots), ...orphans.value]) {
|
||||
if (!queue) continue
|
||||
if (queue.loraName && !names.includes(queue.loraName)) names.push(queue.loraName)
|
||||
@@ -614,6 +621,23 @@ function setSegmentStack(segment: Segment, stack: LoraStackItem[]) {
|
||||
segment.loraName = fields.loraName
|
||||
}
|
||||
|
||||
function insertSegmentTrigger(queue: Queue, segment: Segment, phrase: string) {
|
||||
segment.prompt = insertActivationPhrase(segment.prompt, phrase)
|
||||
saveSegment(queue, segment)
|
||||
}
|
||||
|
||||
async function saveLoraTrigger(name: string, trigger: string) {
|
||||
try {
|
||||
const data = await $fetch<{ loraTriggers?: Record<string, string> }>('/api/library/lora-triggers', {
|
||||
method: 'PUT',
|
||||
body: { key: loraIdentityKey(name), trigger }
|
||||
})
|
||||
if (data.loraTriggers) loraTriggers.value = data.loraTriggers
|
||||
} catch {
|
||||
/* keep the last saved word */
|
||||
}
|
||||
}
|
||||
|
||||
function segmentLoraLabel(queue: Queue, segment: Segment) {
|
||||
const stack = readLoraStack(segment).length ? readLoraStack(segment) : readLoraStack(queue)
|
||||
return loraStackLabel(stack)
|
||||
@@ -1016,6 +1040,9 @@ onMounted(async () => {
|
||||
void $fetch<{ video?: string[] }>('/api/loras').then((listed) => {
|
||||
videoLoras.value = listed.video || []
|
||||
}).catch(() => null)
|
||||
void $fetch<{ loraTriggers?: Record<string, string> }>('/api/library?light=1').then((library) => {
|
||||
if (library.loraTriggers) loraTriggers.value = library.loraTriggers
|
||||
}).catch(() => null)
|
||||
window.addEventListener('keydown', onRemoveKey)
|
||||
await loadQueues().catch((err: any) => {
|
||||
error.value = err?.data?.statusMessage || err?.message || 'Could not load the queue'
|
||||
|
||||
Reference in New Issue
Block a user