Un Workflow sau un Chatflow este format din noduri legate pe canvas. Fiecare nod produce variabile de ieșire pe care nodurile următoare le pot folosi: le alegi din selector sau tastezi / într-un câmp de text, iar în prompturi scrii {{nume_variabila}}. Ieșirile unui nod nu se pot modifica ulterior; pentru valori care se schimbă pe parcursul unei conversații, Chatflow are variabile de conversație, scrise cu nodul Variable Assigner.
Nodurile LLM, HTTP Request, Code și Tool au gestionare a erorilor: None (implicit, fluxul se oprește), Default Value (o valoare de rezervă de același tip) sau Fail Branch (o ramură separată pentru eroare). Cu Default Value sau Fail Branch primești variabilele error_type și error_message. Code și HTTP Request pot reîncerca automat de cel mult 10 ori, cu un interval de cel mult 5000 ms.
Limitele de execuție vin din variabile de mediu, pe instanțele self-hosted: cel mult 50 de noduri pe un drum (MAX_TREE_DEPTH), 500 de execuții de noduri pe rulare (WORKFLOW_MAX_EXECUTION_STEPS), 3600 de secunde pe rulare (WORKFLOW_MAX_EXECUTION_TIME), 10 ramuri paralele (MAX_PARALLEL_LIMIT), 100 de repetări pentru Loop (LOOP_NODE_MAX_COUNT) și 5 niveluri de workflow apelat din workflow (WORKFLOW_CALL_MAX_DEPTH). Vezi variabilele de mediu.
Concepte cheie și caracteristici
| Concept / Parametru | Descriere practică |
|---|---|
User Input |
Nodul de start la cerere (de un utilizator sau prin API). Câmpuri: Short Text (256 de caractere), Paragraph, Select, Number, Checkbox, JSON Code, fișiere. Variabile preset: userinput.query (doar Chatflow) și userinput.files. Un singur User Input pe canvas. |
Schedule Trigger |
Doar Workflow. Rulează la ore sau intervale (selector vizual sau expresie cron cu 5 câmpuri). Cel mult un Schedule Trigger pe workflow. |
Webhook Trigger |
Doar Workflow. Dify generează un URL {TRIGGER_URL}/triggers/webhook/{id}; extragi parametri din query, headere și body. Vezi publicarea. |
Integration Trigger |
Doar Workflow. Pornește la un eveniment dintr-un sistem extern, prin abonarea la un plugin de tip Trigger. |
LLM |
Apelează un model configurat în Integrations › Model Provider. Prompturi pe roluri (System, User, Assistant), context din Knowledge Retrieval, Structured Output (JSON Schema), memorie în Chatflow, fișiere pentru modele multimodale, Jinja2. Cu Enable reasoning tag separation, conținutul dintre etichetele <think> trece în reasoning_content. |
Knowledge Retrieval |
Caută în una sau mai multe baze de cunoștințe și dă rezultatele ca context. Setări la nivel de nod: Weighted Score sau Rerank Model, filtrare după metadate. |
Agent (clasic) |
Modelul primește unelte și decide singur ce apelează, după o strategie: Function Calling sau ReAct (altele se instalează din Marketplace › Agent Strategies). Setezi Max Iterations și memoria. |
Agent (nou, beta) |
Invită un agent publicat din Agents sau creează unul doar pentru acest nod. Ieșire implicită text, plus ieșiri declarate; Output Routes (din 1.18.0) îl lasă să aleagă exact una dintre ramuri. În Chatflow apare doar cu NEXT_PUBLIC_ENABLE_AGENT_V2_IN_CHATFLOW=true. |
Question Classifier |
Un LLM încadrează textul într-una dintre clasele definite; fiecare clasă e o ramură. Ieșiri: class_name (descrierea) și class_label (titlul). |
IF/ELSE |
Ramuri IF, ELIF și ELSE, condiții legate prin AND sau OR (contains, starts with, is empty, greater than etc.). |
Iteration |
Rulează aceiași pași pentru fiecare element dintr-o listă. Variabile interne items (elementul curent) și index (de la 0). Mod secvențial sau paralel (până la 10 elemente simultan); erori: terminated, continue-on-error, remove-abnormal-output. |
Loop / Exit Loop |
Repetă pași care depind de rezultatul pasului anterior. Se oprește la condiția de terminare, la numărul maxim de repetări sau la nodul Exit Loop. Orice eroare într-un nod copil oprește bucla. |
Code |
Python sau JavaScript în serviciul sandbox. Funcția main întoarce un dicționar cu variabilele de ieșire declarate. Ieșirile sunt verificate de limitele CODE_MAX_*. |
Template |
Formatează date cu Jinja2 (bucle, condiții, filtre); ieșirea are cel mult TEMPLATE_TRANSFORM_MAX_LENGTH caractere (implicit 400.000). |
Variable Aggregator |
Reunește ramuri exclusive (de la IF/ELSE sau Question Classifier) într-o singură variabilă, ca să nu dublezi nodurile din aval. |
Variable Assigner |
Scrie variabile de conversație într-un Chatflow; ele se păstrează pe toată sesiunea. |
Parameter Extractor |
Un LLM transformă text liber în parametri structurați pentru unelte, API-uri sau alte noduri. |
Document Extractor |
Transformă fișiere încărcate (PDF, DOCX etc.) în text pentru LLM. |
List Operator |
Filtrează, sortează și selectează elemente din array[string], array[number], array[file], array[boolean]. |
HTTP Request |
GET, HEAD, POST, PUT, PATCH, DELETE; autentificare no-auth sau api-key (basic, bearer, custom); body JSON, Form Data, Binary sau Raw Text; timeouts de conectare, citire și scriere. Răspunsurile binare devin fișiere. |
Tool |
Rulează o unealtă din Integrations › Tools: plugin, API importat din OpenAPI (Swagger), workflow publicat ca unealtă sau server MCP. |
Human Input |
Din 1.13.0. Oprește fluxul și trimite un formular prin web app sau e-mail; butoanele de acțiune aleg ramura următoare; are strategie de timeout. |
Answer |
Doar Chatflow, obligatoriu. Trimite text, imagini și fișiere; poate fi folosit de mai multe ori în flux. |
Output |
Doar Workflow, opțional (fostul End). Numele variabilelor devin chei în outputs din răspunsul API. |
Exemple practice și scenarii reale
Exemplul 1: Nodul Code în Python
Variabilele de intrare din panoul nodului devin parametrii funcției, iar cheile din dicționarul întors trebuie să fie exact variabilele de ieșire declarate.
def main(raspuns_llm: str) -> dict:
import json
date = json.loads(raspuns_llm)
return {
"categorie": date.get("categorie", "altele"),
"urgenta": int(date.get("urgenta", 0)),
}
Exemplul 2: Același nod în JavaScript
function main(raspuns_llm) {
const date = JSON.parse(raspuns_llm);
return {
categorie: date.categorie || "altele",
urgenta: Number(date.urgenta || 0),
};
}
Exemplul 3: Structured Output pentru un nod LLM
Schema se scrie în modul JSON Schema sau se generează din editorul vizual. Dacă lângă Structured apare Model not supported, schimbă modelul sau oprește opțiunea.
{
"type": "object",
"properties": {
"categorie": {"type": "string", "enum": ["facturare", "tehnic", "altele"]},
"urgenta": {"type": "number"}
},
"required": ["categorie", "urgenta"]
}
Exemplul 4: Prompt Jinja2 într-un nod LLM
{% for item in search_results %}
{{ loop.index }}. {{ item.title }}: {{ item.content }}
{% endfor %}
Greșeli frecvente și capcane
- Întorci din Code o listă de șiruri mai lungă de 30 de elemente. Limita implicită
CODE_MAX_STRING_ARRAY_LENGTHeste 30 (la fel pentru liste de obiecte), iar nodul eșuează; pe self-hosted o poți mări. - Pui Answer într-un Workflow sau Output într-un Chatflow. Answer există doar în Chatflow, Output doar în Workflow.
- Folosești Iteration în mod paralel când ordinea contează sau când vrei streaming cu Answer. Pentru asta, documentația recomandă modul secvențial.
- Apelezi din HTTP Request un serviciu din rețeaua internă și primești eroare. Cererile ies prin proxy-ul SSRF, care blochează IP-urile private; adaugă doar gazdele necesare în
SSRF_PROXY_ALLOW_PRIVATE_IPSsauSSRF_PROXY_ALLOW_PRIVATE_DOMAINS.
Întrebări & Exemple practice:
Nodurile din Workflow și Chatflow în Dify: referințăAi o întrebare despre Nodurile din Workflow și Chatflow în Dify: referință sau ai descoperit un truc, prompt sau fragment de cod util? Distribuie-l cu ceilalți membri ai comunității!
Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau resurse pentru această pagină. Dacă ai testat un prompt sau ai un snippet util, adaugă-l mai jos pentru comunitate.