Skip to content

Componenti del Canvas

Il Canvas dispone di 15 componenti suddivisi in sei categorie funzionali. Ogni componente ha parametri di configurazione, produce output identificabili con variabili e serve a uno scopo preciso nel flusso.

Flusso Base

I componenti di flusso base gestiscono il punto di ingresso, le diramazioni logiche e l'output finale verso l'utente.


Begin

Funzione: Punto di ingresso obbligatorio di ogni Canvas. Definisce come il flusso viene avviato e quali dati iniziali sono disponibili.

Quando usarlo: E il primo nodo di ogni Canvas. Ogni flusso deve avere esattamente un nodo Begin.

ParametroTipoDescrizione
modetask | conversationaltask: avvio con form strutturato. conversational: integrazione chat, riceve {{sys.query}} automaticamente.
inputFieldsArraySolo per mode task. Definisce i campi del form di input.

Struttura di un campo inputFields:

SottocampoTipoDescrizione
namestringIdentificatore del campo, usabile come {{sys.inputs.name}}
labelstringEtichetta visibile nel form
typestring | text | select | date | numberTipo del campo
optionsArraySolo per select: lista delle opzioni disponibili
requiredbooleanSe il campo e obbligatorio prima dell'avvio
placeholderstringTesto suggerito nel campo

Output disponibili:

VariabileDescrizione
{{sys.query}}Testo del messaggio utente (mode conversational)
{{sys.inputs.nomeField}}Valore di un campo del form (mode task)
{{sys.user_id}}ID utente corrente
{{sys.company_id}}ID azienda corrente
{{sys.conversation_id}}ID conversazione corrente
{{sys.timestamp}}Timestamp di avvio del flusso (ISO 8601)

Esempio — Form assicurativo:

yaml
mode: task
inputFields:
  - name: tipoSinistro
    label: Tipo di Sinistro
    type: select
    options: [Auto, Vita, Casa, RC, Altro]
    required: true
  - name: dataSinistro
    label: Data del Sinistro
    type: date
    required: true
  - name: descrizione
    label: Descrizione dell'Evento
    type: text
    required: true
    placeholder: Descrivi l'accaduto in dettaglio
  - name: numeroPolizza
    label: Numero Polizza
    type: string
    required: true

Message

Funzione: Nodo di output che presenta il risultato finale all'utente. E il nodo terminale del flusso o di un ramo.

Quando usarlo: Alla fine di ogni ramo del flusso per mostrare una risposta. Un flusso puo avere piu nodi Message (uno per ogni ramo del Switch).

ParametroTipoDescrizione
contentstringContenuto da mostrare. Accetta variabili come {{llm_1.content}}. Puo essere testo statico.
formatmarkdown | plainFormato di rendering del testo. Usa markdown per risposte LLM.
showCitationsbooleanSe mostrare i badge delle fonti e le citazioni [N]. Default: true.

Output disponibili: Il nodo Message non produce output variabili (e un nodo terminale).

Esempio — Risposta statica per topic fuori ambito:

yaml
content: |
  Mi dispiace, questa domanda non rientra nell'ambito
  dell'assistente attuale. Per richieste di questo tipo,
  ti prego di contattare direttamente il team competente.
format: markdown
showCitations: false

Esempio — Risposta dinamica da LLM:

yaml
content: "{{llm_1.content}}"
format: markdown
showCitations: true

Switch

Funzione: Nodo di routing che valuta condizioni logiche e instrada l'esecuzione verso rami diversi.

Quando usarlo: Quando il flusso deve comportarsi diversamente in base a una categoria, a una parola chiave nella risposta, o a un valore di un campo.

ParametroTipoDescrizione
conditionsArrayLista di condizioni valutate in ordine. La prima vera viene seguita.
elseGotostringID del nodo da raggiungere se nessuna condizione e vera.

Struttura di una condizione:

SottocampoTipoDescrizione
variablestringVariabile da valutare (es. {{categorize_1.category}})
operatorstringOperatore di confronto (vedi tabella sotto)
valuestringValore da confrontare
gotostringID del nodo di destinazione se la condizione e vera

Operatori disponibili:

OperatoreSignificato
equalsUguale a (case-insensitive)
not_equalsDiverso da
containsContiene la stringa
not_containsNon contiene la stringa
starts_withInizia con
ends_withFinisce con
greater_thanMaggiore di (numerico)
less_thanMinore di (numerico)
is_emptyIl valore e vuoto o null
is_not_emptyIl valore non e vuoto

Output disponibili: Il nodo Switch non produce output variabili, gestisce solo il routing.

Esempio — Routing per categoria:

yaml
conditions:
  - variable: "{{categorize_1.category}}"
    operator: equals
    value: "Tecnico"
    goto: llm_tecnico
  - variable: "{{categorize_1.category}}"
    operator: equals
    value: "Commerciale"
    goto: llm_commerciale
elseGoto: message_generico

Intelligenza Artificiale

Componenti che coinvolgono modelli linguistici e recupero di informazioni.


LLM

Funzione: Chiama un modello linguistico con un prompt configurabile e produce testo in output. E il componente principale per generare risposte, analisi, classificazioni e trasformazioni di testo.

Quando usarlo: Per generare risposte all'utente, analizzare contenuti recuperati, sintetizzare informazioni, o classificare testo in modalita freeform.

ParametroTipoDescrizione
modelwriter | plannerwriter: Qwen3-80B, risposte articolate e ragionamento profondo. planner: Qwen3-30B, classificazioni rapide e task semplici.
systemPromptstringIstruzioni di contesto per il modello (persona, regole, formato output). Accetta variabili.
userPromptstringIl testo effettivo della richiesta al modello. Accetta variabili.
temperaturenumberCreativita della risposta. 0.1-0.3 per risposte fattuali, 0.7-0.9 per testo creativo. Default: 0.3.
maxTokensnumberLunghezza massima della risposta in token. Default: 2048. Max: 8192.
jsonModebooleanSe true, il modello produce un oggetto JSON valido. Utile per estrarre dati strutturati. Default: false.

Output disponibili:

VariabileDescrizione
{{llm_N.content}}Testo completo generato dal modello
{{llm_N.usage.promptTokens}}Token usati nel prompt
{{llm_N.usage.completionTokens}}Token usati nella risposta

Esempio — Analisi con JSON Mode:

yaml
model: planner
systemPrompt: |
  Sei un classificatore. Rispondi SOLO con JSON valido,
  senza testo aggiuntivo.
userPrompt: |
  Classifica questo testo come POSITIVO, NEGATIVO o NEUTRO.
  Testo: {{sys.query}}

  Rispondi con: {"sentiment": "POSITIVO|NEGATIVO|NEUTRO", "confidence": 0.0-1.0}
temperature: 0.1
jsonMode: true

Esempio — Analisi documentale:

yaml
model: writer
systemPrompt: |
  Sei un perito assicurativo senior. Analizza la documentazione
  fornita e fornisci una valutazione tecnica dettagliata.
  Cita sempre le fonti con [N]. Rispondi in italiano.
userPrompt: |
  Tipo sinistro: {{sys.inputs.tipoSinistro}}
  Data: {{sys.inputs.dataSinistro}}

  Documenti di polizza e normativa applicabile:
  {{retrieval_1.formalized_content}}

  Descrizione evento:
  {{sys.inputs.descrizione}}

  Fornisci: 1) Valutazione copertura 2) Normativa applicabile 3) Documentazione aggiuntiva richiesta
temperature: 0.2
maxTokens: 4096

Retrieval

Funzione: Esegue una ricerca ibrida (semantica + full-text) nei documenti aziendali, nella Knowledge Base e nelle sorgenti esterne abilitate. Restituisce i passaggi piu pertinenti alla query.

Quando usarlo: Ogni volta che il flusso ha bisogno di contesto documentale. E il nodo che connette le domande dell'utente al patrimonio informativo dell'organizzazione.

ParametroTipoDescrizione
querystringTesto di ricerca. Usa {{sys.query}} o una variabile elaborata. Accetta testo statico combinato con variabili.
topKnumberNumero massimo di passaggi da recuperare. Range: 5-50. Default: 10.
scoreThresholdnumberSoglia minima di pertinenza (0.0-1.0). Passaggi sotto soglia vengono esclusi. Default: 0.5.
useRerankingbooleanSe applicare il reranker BGE per riordinare i risultati. Consigliato per qualita. Default: true.
companyDocsbooleanCerca nei documenti aziendali caricati. Default: true.
knowledgeBasebooleanCerca nella Knowledge Base curata. Default: true.
legalSourcesbooleanCerca in Normattiva (fonti normative italiane ed europee). Default: false.
foodSourcesbooleanCerca in Open Food Facts (prodotti alimentari). Default: false.
chemSourcesbooleanCerca in ECHA/REACH (sostanze chimiche, SDS). Default: false.
pharmaSourcesbooleanCerca in FDA/ClinicalTrials/PubMed (farmaci, trial, pubblicazioni). Default: false.
aeSourcesbooleanCerca in Agenzia delle Entrate (normativa fiscale italiana). Default: false.
topicIdsArrayLista di ID topic per limitare la ricerca a specifiche categorie. Opzionale.

Output disponibili:

VariabileDescrizione
{{retrieval_N.formalized_content}}Testo formattato dei passaggi trovati, pronto per un prompt LLM. Include titoli e riferimenti.
{{retrieval_N.results}}Array JSON dei risultati completi con score, metadata, fonte.
{{retrieval_N.count}}Numero di passaggi recuperati.

Esempio — Ricerca multi-sorgente legale:

yaml
query: "{{sys.inputs.tipoSinistro}} polizza assicurativa copertura {{sys.inputs.descrizione}}"
topK: 20
useReranking: true
companyDocs: true
knowledgeBase: true
legalSources: true

Categorize

Funzione: Classifica il testo di input in una delle categorie predefinite usando un modello LLM veloce. Instrada automaticamente l'esecuzione verso il ramo corrispondente.

Quando usarlo: Per routing intelligente basato sul contenuto della domanda, senza condizioni rigide. Piu robusto di Switch per categorizzazioni semantiche.

ParametroTipoDescrizione
inputstringTesto da classificare. Di solito {{sys.query}}.
categoriesArrayLista di categorie con etichetta, descrizione e nodo di destinazione.
minConfidencenumberConfidenza minima richiesta. Se la classificazione scende sotto questa soglia, viene usata la categoria other. Default: 0.6.

Struttura di una categoria:

SottocampoTipoDescrizione
namestringNome della categoria (usato come valore dell'output)
descriptionstringDescrizione per aiutare il modello a classificare correttamente
gotostringID del nodo di destinazione per questa categoria

Output disponibili:

VariabileDescrizione
{{categorize_N.category}}Nome della categoria assegnata
{{categorize_N.confidence}}Confidenza della classificazione (0.0-1.0)
{{categorize_N.reasoning}}Breve spiegazione della classificazione

Esempio — Routing per tipo di domanda:

yaml
input: "{{sys.query}}"
minConfidence: 0.65
categories:
  - name: Tecnico
    description: Domande su prodotti, specifiche tecniche, manuali, installazioni, guasti
    goto: llm_tecnico
  - name: Commerciale
    description: Domande su prezzi, offerte, contratti, promozioni, disponibilita
    goto: llm_commerciale
  - name: Normativo
    description: Domande su leggi, regolamenti, certificazioni, obblighi di legge
    goto: retrieval_normativo
  - name: Altro
    description: Domande non pertinenti all'ambito aziendale
    goto: message_fuori_ambito

Agent

Funzione: Esegue un ciclo ReAct (Reasoning + Acting) autonomo. Il modello decide quale strumento usare, lo chiama, valuta il risultato e decide se servono ulteriori passi o se la risposta e completa.

Quando usarlo: Per task che richiedono ragionamento multi-step non determinabile a priori. L'Agent e piu flessibile di una sequenza fissa ma piu lento. Usa il modello writer per la massima qualita.

ParametroTipoDescrizione
systemPromptstringDescrizione del ruolo e delle istruzioni per l'agente.
userPromptstringIl task da eseguire. Accetta variabili.
toolsArrayLista degli strumenti disponibili (vedi tabella sotto).
maxRoundsnumberNumero massimo di iterazioni ReAct. Default: 5. Max: 10.
modelwriter | plannerModello da usare. writer per task complessi.

Strumenti disponibili:

Tool IDDescrizione
retrievalRicerca nei documenti aziendali e KB
legal_searchRicerca in Legal Sources (Normattiva)
pharma_searchRicerca in Pharma Sources (FDA/PubMed)
food_searchRicerca in Food Sources (Open Food Facts)
chem_searchRicerca in Chem Sources (ECHA/REACH)
graph_queryQuery sul grafo Neo4j (entita e relazioni)

Output disponibili:

VariabileDescrizione
{{agent_N.content}}Risposta finale elaborata dall'agente
{{agent_N.steps}}Array JSON dei passi ReAct eseguiti
{{agent_N.toolCalls}}Numero totale di tool call effettuate

Esempio:

yaml
systemPrompt: |
  Sei un ricercatore esperto in normativa alimentare europea.
  Usa gli strumenti disponibili per rispondere con precisione,
  citando sempre le fonti normative.
userPrompt: "{{sys.query}}"
tools: [retrieval, food_search, legal_search]
maxRounds: 6
model: writer

Interazione Utente


UserFillUp

Funzione: Sospende l'esecuzione del flusso e mostra un form all'utente per raccogliere informazioni aggiuntive. Quando l'utente invia il form, l'esecuzione riprende dal punto successivo.

Quando usarlo: Quando il flusso ha bisogno di documenti, dati o chiarimenti che non erano disponibili all'avvio. Tipico nei flussi di gestione sinistri, audit o due diligence.

ParametroTipoDescrizione
messagestringMessaggio mostrato all'utente prima del form. Spiega cosa e necessario e perche. Accetta variabili.
fieldsArrayCampi del form (stessa struttura di Begin inputFields, con aggiunta di type: file).
tipsstringSuggerimenti opzionali mostrati sotto il form (es. "Accetta PDF, JPG, PNG fino a 10MB").

Tipo campo aggiuntivo per UserFillUp:

TipoDescrizione
fileCaricamento file. Supporta PDF, DOCX, immagini. Il file viene vettorizzato e disponibile come documento temporaneo.

Output disponibili:

VariabileDescrizione
{{userfillup_N.inputs.nomeField}}Valore del campo compilato dall'utente
{{userfillup_N.inputs.nomeFile}}Riferimento al file caricato (se type: file)

Esempio:

yaml
message: |
  La documentazione iniziale non e sufficiente per confermare
  la copertura. Ti chiediamo di fornire i seguenti documenti:
fields:
  - name: fotoDanno
    label: Foto del danno
    type: file
    required: true
  - name: perizia
    label: Perizia tecnica (se disponibile)
    type: file
    required: false
  - name: note
    label: Note aggiuntive
    type: text
    required: false
    placeholder: Informazioni aggiuntive sull'accaduto
tips: "Formati accettati: PDF, JPG, PNG, DOCX. Dimensione massima: 20MB per file."

Manipolazione Dati

Componenti per trasformare, combinare e filtrare dati all'interno del flusso.


VariableAssigner

Funzione: Crea o trasforma variabili combinando valori esistenti. Utile per costruire testi composti, unire array o preparare dati per i nodi successivi.

Quando usarlo: Per costruire stringhe di query da piu input, unire output di nodi diversi, o preparare dati strutturati.

ParametroTipoDescrizione
assignmentsArrayLista di assegnazioni variabile → valore.

Struttura di un'assegnazione:

SottocampoTipoDescrizione
namestringNome della variabile di output
typeconcat | merge | array | customTipo di operazione
valuestring / ArrayValore o template. Per concat: stringa con variabili. Per merge: oggetti da unire. Per array: lista di valori.

Output disponibili:

VariabileDescrizione
{{variableassigner_N.nomeVariabile}}Valore assegnato alla variabile definita

Operazioni disponibili:

TipoUso
concatConcatena stringhe e variabili in un unico testo
mergeUnisce oggetti JSON
arrayCrea un array da una lista di valori
customEspressione di trasformazione freeform

Esempio — Costruire query composta:

yaml
assignments:
  - name: queryCompleta
    type: concat
    value: "Sinistro {{sys.inputs.tipoSinistro}} del {{sys.inputs.dataSinistro}}: {{sys.inputs.descrizione}}"

VariableAggregator

Funzione: Raccoglie il primo valore non vuoto tra piu sorgenti variabile. Utile per gestire fallback quando un nodo puo non produrre output.

Quando usarlo: Quando piu rami del flusso possono produrre un risultato e vuoi passare il primo disponibile al nodo successivo.

ParametroTipoDescrizione
sourcesArrayLista di variabili da controllare in ordine. Viene usata la prima non vuota.
outputNamestringNome della variabile di output aggregata.

Output disponibili:

VariabileDescrizione
{{variableaggregator_N.outputName}}Primo valore non vuoto tra le sorgenti

Esempio — Fallback tra due LLM:

yaml
sources:
  - "{{llm_writer.content}}"
  - "{{llm_planner.content}}"
outputName: rispostaFinale

DataOperations

Funzione: Applica trasformazioni su array e testi: filtro, mappa, ordinamento, taglio, estrazione, unione, divisione, deduplicazione.

Quando usarlo: Per elaborare liste di risultati (es. filtrare trial clinici per fase, estrarre solo i titoli, deduplicare per ID).

ParametroTipoDescrizione
inputstringVariabile di input da elaborare (tipicamente un array JSON).
operationstringTipo di operazione da applicare (vedi tabella).
paramsobjectParametri specifici dell'operazione.

Operazioni disponibili:

OperazioneDescrizioneParametri chiave
filterFiltra elementi che soddisfano una condizionefield, operator, value
mapTrasforma ogni elemento estraendo un campofield
sortOrdina per un campofield, direction (asc/desc)
slicePrende una porzione dell'arraystart, end
extractEstrae un campo da ogni oggettofield
joinUnisce gli elementi dell'array in una stringaseparator
splitDivide una stringa in arrayseparator
deduplicateRimuove duplicatifield (campo chiave per dedup)

Output disponibili:

VariabileDescrizione
{{dataoperations_N.result}}Risultato dell'operazione
{{dataoperations_N.count}}Numero di elementi risultanti

Esempio — Filtrare trial clinici per fase:

yaml
input: "{{retrieval_1.results}}"
operation: filter
params:
  field: metadata.phase
  operator: contains
  value: "Phase 3"

Cicli

Componenti per iterare su liste di elementi o ripetere blocchi fino a soddisfare una condizione.


Iteration

Funzione: Itera su ogni elemento di un array, eseguendo una sotto-sequenza di nodi per ciascuno.

Quando usarlo: Per elaborare una lista di elementi uno per uno — ad esempio analizzare ogni trial clinico trovato, o processare ogni documento in un elenco.

ParametroTipoDescrizione
inputstringVariabile array su cui iterare.
iterationNodeIdsArrayLista degli ID dei nodi da eseguire per ogni elemento.

Variabili di contesto disponibili durante l'iterazione:

VariabileDescrizione
{{iter.item}}Elemento corrente dell'array
{{iter.index}}Indice corrente (base 0)
{{iter.total}}Numero totale di elementi

Output disponibili:

VariabileDescrizione
{{iteration_N.results}}Array con i risultati di ogni iterazione
{{iteration_N.count}}Numero di iterazioni completate

Esempio — Analizzare ogni trial clinico:

yaml
input: "{{dataoperations_1.result}}"
iterationNodeIds: [llm_analisi_trial]

All'interno di llm_analisi_trial, usa {{iter.item.title}}, {{iter.item.phase}}, ecc.


Loop

Funzione: Ripete un blocco di nodi finche una condizione e vera o viene raggiunto il numero massimo di iterazioni. Utile per raffinamento iterativo o ricerca approfondita.

Quando usarlo: Per processi di raffinamento dove non conosci a priori quante iterazioni servono — ad esempio ricerca progressiva fino a trovare la risposta o raggiungere la confidenza desiderata.

ParametroTipoDescrizione
conditionstringEspressione booleana: il loop continua finche e true. Accetta variabili.
maxIterationsnumberLimite massimo di iterazioni per evitare loop infiniti. Default: 5. Max: 20.
loopNodeIdsArrayLista degli ID dei nodi da eseguire ad ogni iterazione.

Variabili di contesto disponibili durante il loop:

VariabileDescrizione
{{loop.iteration}}Numero iterazione corrente (base 1)
{{loop.previousResult}}Output dell'iterazione precedente

Output disponibili:

VariabileDescrizione
{{loop_N.finalResult}}Risultato dell'ultima iterazione eseguita
{{loop_N.iterations}}Numero totale di iterazioni eseguite
{{loop_N.exitedEarly}}true se il loop e uscito per ExitLoop

ExitLoop

Funzione: Esce immediatamente dal Loop corrente, anche se la condizione del Loop e ancora vera. Posizionato all'interno del blocco di nodi del Loop.

Quando usarlo: Per uscire dal loop quando una condizione specifica e soddisfatta prima di raggiungere maxIterations — ad esempio quando la confidenza e sufficiente.

ParametroTipoDescrizione
conditionstringEsce dal loop se questa condizione e true. Se omessa, esce sempre quando raggiunto.

Esempio — Loop con uscita anticipata:

Loop (condition: "{{llm_eval.confidence}} < 0.8", maxIterations: 4)
  → Retrieval (query affinata)
  → LLM (valutazione confidenza)
  → ExitLoop (condition: "{{llm_eval.confidence}} >= 0.8")

Composizione


Invoke

Funzione: Esegue un altro Canvas come sotto-flusso. Permette di riutilizzare flussi esistenti come blocchi modulari.

Quando usarlo: Per scomporre flussi complessi in moduli riutilizzabili, o per chiamare un Canvas specializzato (es. un analizzatore legale) da piu Canvas diversi.

ParametroTipoDescrizione
canvasIdstringID del Canvas da invocare.
inputMappingobjectMappa tra variabili del Canvas corrente e input attesi dal sub-Canvas.
timeoutnumberTimeout in millisecondi per il completamento del sub-Canvas. Default: 30000.

Output disponibili:

VariabileDescrizione
{{invoke_N.output}}Output completo del sub-Canvas
{{invoke_N.status}}success | error | timeout

Esempio — Invocare un analizzatore legale:

yaml
canvasId: "canvas_analisi_normativa_abc123"
inputMapping:
  query: "{{sys.inputs.tipoContratto}} {{sys.inputs.descrizione}}"
  topicId: "legale"
timeout: 45000

Riepilogo Output per Componente

ComponenteVariabile Output Principale
Begin{{sys.query}}, {{sys.inputs.campo}}
LLM{{llm_N.content}}
Retrieval{{retrieval_N.formalized_content}}, {{retrieval_N.results}}
Categorize{{categorize_N.category}}, {{categorize_N.confidence}}
Agent{{agent_N.content}}
UserFillUp{{userfillup_N.inputs.campo}}
Switch(nessun output, solo routing)
Message(nessun output, nodo terminale)
VariableAssigner{{variableassigner_N.nomeVar}}
VariableAggregator{{variableaggregator_N.outputName}}
DataOperations{{dataoperations_N.result}}
Iteration{{iteration_N.results}}
Loop{{loop_N.finalResult}}
ExitLoop(nessun output, gestisce il loop)
Invoke{{invoke_N.output}}

Nomi automatici dei nodi

Il Canvas assegna nomi automatici ai nodi (llm_1, retrieval_2, ecc.) in base al tipo e all'ordine di inserimento. Puoi vedere il nome assegnato nell'header del nodo nel workspace. Il nome e usato come namespace nelle variabili.


Queria v3.1.2 -- Canvas Agent Builder

Queria - Document Intelligence con Cog-RAG