Read production LoRA names in Studio 2

This commit is contained in:
Towsty
2026-09-12 21:05:11 -05:00
parent fb87a50a39
commit 064f1db933
7 changed files with 73 additions and 4 deletions
@@ -0,0 +1,22 @@
"""Export only LoRA labels/triggers; invoked by the host's catalog change watcher."""
import json
import os
import sys
from pathlib import Path
def export(source, destination):
catalog = json.loads(Path(source).read_text())
result = {key: {name: value for name, value in catalog.get(key, {}).items()
if isinstance(value, str)} for key in ('loraAliases', 'loraTriggers')}
target = Path(destination)
content = json.dumps(result, ensure_ascii=False)
if target.exists() and target.read_text() == content:
return
target.parent.mkdir(parents=True, exist_ok=True)
temporary = target.with_suffix('.tmp')
temporary.write_text(content)
os.chmod(temporary, 0o644)
temporary.replace(target)
if __name__ == '__main__':
export(*sys.argv[1:])
+15
View File
@@ -0,0 +1,15 @@
import {readFileSync} from 'node:fs';
import {getLoraAliases,getLoraTriggers} from '../library';
import {loraIdentityKey} from '~/utils/loras';
import {join} from 'node:path';
import {studio2Root} from './store';
/** Optional metadata-only production export; no production media/catalog mount. */
export function studio2LoraCatalog(owner: string) {
const local={aliases:getLoraAliases(owner),triggers:getLoraTriggers(owner)};
try {
const source=JSON.parse(readFileSync(process.env.STUDIO2_LORA_CATALOG_PATH || join(studio2Root(),'shared-lora-catalog.cache'),'utf8'));
const normalize=(map: any)=>Object.fromEntries(Object.entries(map || {}).filter(([,value])=>typeof value==='string').map(([key,value])=>[loraIdentityKey(key),value]));
return {aliases:{...local.aliases,...normalize(source.loraAliases)},triggers:{...local.triggers,...normalize(source.loraTriggers)}};
} catch { return local; }
}