ComfyUI Custom Node to LM Studio

Image

ComfyUI Custom Node to LM Studio

Nel mondo dell’intelligenza artificiale generativa siamo abituati a pensare in termini di servizi cloud: piattaforme online, API proprietarie, abbonamenti, crediti, code di generazione e filtri imposti dal provider. È una strada comoda, spesso potente, ma non è l’unica.

Esiste un’alternativa sempre più interessante per chi sperimenta con immagini, prompt, workflow creativi e automazioni: collegare ComfyUI a LM Studio in locale.

In pratica, ComfyUI continua a occuparsi della parte visuale e generativa, mentre LM Studio diventa il “cervello linguistico” locale capace di interpretare, riscrivere, espandere o trasformare prompt testuali prima che vengano inviati ai modelli di immagine.

Il concetto è simile a quello già visto per collegare una semplice app PHP a LM Studio tramite API locali: LM Studio espone un endpoint compatibile con OpenAI, raggiungibile ad esempio su http://127.0.0.1:1234/v1/chat/completions, e un’applicazione esterna può inviargli un testo e ricevere una risposta. Con ComfyUI il ragionamento diventa ancora più interessante.

ComfyUI come laboratorio creativo

ComfyUI non è solo un’interfaccia per generare immagini. È un ambiente nodale in cui ogni passaggio può essere controllato, collegato, modificato e automatizzato. Normalmente queste fasi vengono fatte a mano, oppure usando strumenti esterni come ChatGPT, Claude, Gemini o altri assistenti online. Ma questo introduce un problema: ogni volta che vuoi trasformare un’idea in prompt, devi uscire dal workflow, copiare, incollare, modificare e rientrare in ComfyUI. Collegando ComfyUI a LM Studio, invece, il processo può diventare interno.

LM Studio come assistente linguistico

LM Studio permette di eseguire modelli linguistici direttamente sul proprio computer. Una volta caricato un modello, è possibile attivare un server locale compatibile con le API OpenAI e farlo dialogare con altre applicazioni. Questo significa che ComfyUI può inviare richieste a LM Studio senza passare da Internet, senza usare API cloud e senza dipendere da un servizio esterno. I vantaggi principali sono quattro.

Privacy: è importante se lavori con concept art riservati, progetti aziendali, personaggi originali, storyboard non pubblici, idee commerciali, clienti, prototipi, ricerca creativa.

Continuità del workflow: un nodo interfacciato con LM Studio può espandere prompt brevi, tradurre prompt italiani in inglese, generare prompt negativi, creare varianti stilistiche, riscrivere prompt per modelli specifici, trasformare una descrizione narrativa in prompt tecnico, generare descrizioni coerenti per più immagini, creare prompt per character sheet, creare prompt per storyboard,

Libertà creativa: le piattaforme cloud spesso applicano limiti molto rigidi. Alcuni sono necessari e sensati, soprattutto quando riguardano sicurezza, privacy, minori, violenza reale o contenuti illegali. Altri però possono diventare frustranti in ambito creativo, perché bloccano o alterano anche richieste legittime. Con il giusto modello linguistico in campo artistico potresti lavorare liberamente su horror gotico, scene di battaglia manga, personaggi villain, estetiche pulp e narrazione adulta.

Un servizio pubblico potrebbe rifiutare, ammorbidire o reinterpretare il prompt, anche quando l’intento è chiaramente artistico, narrativo o simbolico. Un modello locale “uncensored” o meno restrittivo può invece darti maggiore libertà nella fase di scrittura creativa del prompt. Non significa usare l’AI senza responsabilità. Significa avere uno strumento meno paternalistico quando stai lavorando su immaginari complessi, maturi o non convenzionali. La differenza è importante perché non si tratta di “fare qualsiasi cosa”, ma di poter esplorare territori creativi che le AI pubbliche spesso trattano in modo troppo prudente.

Controllo tecnico: Con un sistema locale puoi decidere tu quale modello usare, quanta temperatura applicare, quanti token generare.

ComfyUI Custom Node

Ci serve un nodo custom per ComfyUI, da programmare python.

Plaintext
import json
import urllib.request
import urllib.error


class LMStudioTextPrompt:
    """
    Nodo ComfyUI:
    - riceve un testo
    - lo invia a LM Studio in locale
    - attende la risposta
    - restituisce il testo generato
    """

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "prompt": (
                    "STRING",
                    {
                        "multiline": True,
                        "default": "Scrivi una descrizione cinematografica di un robot in una foresta."
                    }
                ),
                "system_prompt": (
                    "STRING",
                    {
                        "multiline": True,
                        "default": "Sei un assistente utile, conciso e creativo."
                    }
                ),
                "model": (
                    "STRING",
                    {
                        "default": "google/gemma-3-4b"
                    }
                ),
                "base_url": (
                    "STRING",
                    {
                        "default": "http://127.0.0.1:1234/v1"
                    }
                ),
                "temperature": (
                    "FLOAT",
                    {
                        "default": 0.7,
                        "min": 0.0,
                        "max": 2.0,
                        "step": 0.1
                    }
                ),
                "max_tokens": (
                    "INT",
                    {
                        "default": 512,
                        "min": 1,
                        "max": 8192,
                        "step": 1
                    }
                ),
                "timeout": (
                    "INT",
                    {
                        "default": 120,
                        "min": 5,
                        "max": 600,
                        "step": 1
                    }
                ),
            }
        }

    RETURN_TYPES = ("STRING",)
    RETURN_NAMES = ("response",)
    FUNCTION = "ask_lmstudio"
    CATEGORY = "LM Studio"

    def ask_lmstudio(
        self,
        prompt,
        system_prompt,
        model,
        base_url,
        temperature,
        max_tokens,
        timeout
    ):
        endpoint = base_url.rstrip("/") + "/chat/completions"

        payload = {
            "model": model,
            "messages": [
                {
                    "role": "system",
                    "content": system_prompt
                },
                {
                    "role": "user",
                    "content": prompt
                }
            ],
            "temperature": float(temperature),
            "max_tokens": int(max_tokens)
        }

        data = json.dumps(payload).encode("utf-8")

        request = urllib.request.Request(
            endpoint,
            data=data,
            headers={
                "Content-Type": "application/json"
            },
            method="POST"
        )

        try:
            with urllib.request.urlopen(request, timeout=int(timeout)) as response:
                raw = response.read().decode("utf-8")
                result = json.loads(raw)

        except urllib.error.HTTPError as e:
            error_body = e.read().decode("utf-8", errors="replace")
            return (f"Errore HTTP da LM Studio: {e.code}\n{error_body}",)

        except urllib.error.URLError as e:
            return (
                "Errore di connessione a LM Studio.\n"
                f"Endpoint usato: {endpoint}\n"
                f"Dettaglio: {e}",
            )

        except Exception as e:
            return (f"Errore generico durante la chiamata a LM Studio: {e}",)

        try:
            content = result["choices"][0]["message"]["content"]
        except Exception:
            content = json.dumps(result, indent=2, ensure_ascii=False)

        return (content,)


NODE_CLASS_MAPPINGS = {
    "LMStudioTextPrompt": LMStudioTextPrompt
}

NODE_DISPLAY_NAME_MAPPINGS = {
    "LMStudioTextPrompt": "LM Studio Text Prompt"
}
Plaintext
Salvate il file come __init__.py nel percorso che segue:

ComfyUI/
└── custom_nodes/
    └── ComfyUI_LMStudio_Text/
        └── __init__.py

Avviate LM Studio, caricate il modello desiderato e attivate il server locale dalla sezione Developer. A questo punto avviate ComfyUI e inserite nell’area di lavoro il nodo LM Studio Text Prompt, FINITO!

Collegare ComfyUI a LM Studio in locale significa aggiungere un livello di intelligenza testuale direttamente dentro il workflow creativo. Non si tratta solo di generare immagini, ma di costruire un piccolo ecosistema personale in cui il prompt può essere interpretato, espanso, tradotto, raffinato e trasformato prima ancora di arrivare al modello visuale.

Il vantaggio è evidente: più controllo, più privacy e maggiore libertà sperimentale. Tutto resta sulla propria macchina, senza dipendere da servizi cloud, limiti esterni o filtri pensati per piattaforme generaliste.

È una base semplice, ma potente. Da qui si può crescere facilmente con prompt enhancer, generatore di negative prompt, traduttore automatico, assistente per stili, supporto alla creazione di personaggi, varianti narrative e interi workflow guidati dal linguaggio naturale. In parole povere, ComfyUI disegna la scena, LM Studio aiuta a immaginarla meglio.

Se l’articolo ti è piaciuto restiamo in contatto su linkedin a: https://www.linkedin.com/in/andreatonin/

Releated Posts

L’AI nell’ufficio qualità: più metodo nel lavoro quotidiano

L’ufficio qualità vive spesso in mezzo a documenti che cambiano, procedure da aggiornare, verbali da sistemare, report da…

DiByAndrea Tonin Giu 7, 2026

Feline: viaggio tecnico-creativo con Seedance

Come vi raccontavo qualche articolo fa, sto effettuando studi piuttosto approfonditi su Seedance, con un obiettivo molto preciso:…

DiByAndrea Tonin Giu 6, 2026

I Tag Danbooru nei Modelli di Diffusione

I professionisti della grafica (illustratori, concept artist, 3D artist) si trovano spesso a confrontarsi con il “prompting”. Se…

DiByAndrea Tonin Mag 31, 2026

Be or Not Be: Seedance from Hell

Oggi ho voglia di sperimentare con il lipsync, voglio capire fin dove può arrivare Seedance quando gli dai…

DiByAndrea Tonin Mag 27, 2026