Files
dify/api/core/workflow
+51
qiuqiuaGitHubQuantumGhost盐粒 YanliwangxiaoleiStephen Zhougemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>Cursxautofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>lif非法操作Asuka Minatofenglinqiaofenglin-LAN-TomoOkuyamaTomo Okuyamadependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>zyssyz123hj24Coding On StarCodingOnStaryyhXiangxuan QufghpdfcoopercoderzhaiguangpengJunyan QinE.GGlobalStar117Claude Haiku 4.5CodingOnStarcrazywoolaheysztNeatGuyCodingYeuolyzxhlyhmoonpandawarlocgaogithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>claude[bot] <41898282+claude[bot]@users.noreply.github.com>KVOJJJineuxbangjiehanFFXNJyongNie RonghuaJQSevenMiaojiasiqiSeokrin Taron SungCrabSAMACopilotyihongJoelWu TianweiyesseniaJaxniveshdandyanOSS ContributorniveshdandyanSean Kenneth Doherty
9ef6b90843 feat: sync main branch (#31938)
Signed-off-by: majiayu000 <[email protected]>
Signed-off-by: dependabot[bot] <[email protected]>
Signed-off-by: NeatGuyCoding <[email protected]>
Signed-off-by: -LAN- <[email protected]>
Signed-off-by: yihong0618 <[email protected]>
Co-authored-by: QuantumGhost <[email protected]>
Co-authored-by: 盐粒 Yanli <[email protected]>
Co-authored-by: wangxiaolei <[email protected]>
Co-authored-by: Stephen Zhou <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Cursx <[email protected]>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: lif <[email protected]>
Co-authored-by: 非法操作 <[email protected]>
Co-authored-by: Asuka Minato <[email protected]>
Co-authored-by: fenglin <[email protected]>
Co-authored-by: qiaofenglin <[email protected]>
Co-authored-by: -LAN- <[email protected]>
Co-authored-by: TomoOkuyama <[email protected]>
Co-authored-by: Tomo Okuyama <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: zyssyz123 <[email protected]>
Co-authored-by: hj24 <[email protected]>
Co-authored-by: Coding On Star <[email protected]>
Co-authored-by: CodingOnStar <[email protected]>
Co-authored-by: yyh <[email protected]>
Co-authored-by: Xiangxuan Qu <[email protected]>
Co-authored-by: fghpdf <[email protected]>
Co-authored-by: coopercoder <[email protected]>
Co-authored-by: zhaiguangpeng <[email protected]>
Co-authored-by: Junyan Qin (Chin) <[email protected]>
Co-authored-by: E.G <[email protected]>
Co-authored-by: GlobalStar117 <[email protected]>
Co-authored-by: Claude Haiku 4.5 <[email protected]>
Co-authored-by: CodingOnStar <[email protected]>
Co-authored-by: crazywoola <[email protected]>
Co-authored-by: heyszt <[email protected]>
Co-authored-by: NeatGuyCoding <[email protected]>
Co-authored-by: Yeuoly <[email protected]>
Co-authored-by: zxhlyh <[email protected]>
Co-authored-by: moonpanda <[email protected]>
Co-authored-by: warlocgao <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: KVOJJJin <[email protected]>
Co-authored-by: eux <[email protected]>
Co-authored-by: bangjiehan <[email protected]>
Co-authored-by: FFXN <[email protected]>
Co-authored-by: Jyong <[email protected]>
Co-authored-by: Nie Ronghua <[email protected]>
Co-authored-by: JQSevenMiao <[email protected]>
Co-authored-by: jiasiqi <[email protected]>
Co-authored-by: Seokrin Taron Sung <[email protected]>
Co-authored-by: CrabSAMA <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: yihong <[email protected]>
Co-authored-by: Joel <[email protected]>
Co-authored-by: Wu Tianwei <[email protected]>
Co-authored-by: yessenia <[email protected]>
Co-authored-by: Jax <[email protected]>
Co-authored-by: niveshdandyan <[email protected]>
Co-authored-by: OSS Contributor <[email protected]>
Co-authored-by: niveshdandyan <[email protected]>
Co-authored-by: Sean Kenneth Doherty <[email protected]>
2026-02-04 19:04:24 +08:00
..
2026-02-04 19:04:24 +08:00
2026-02-04 19:04:24 +08:00
2026-02-04 19:04:24 +08:00
2026-02-04 19:04:24 +08:00
2026-02-04 19:04:24 +08:00
2024-04-08 18:51:46 +08:00
2025-09-18 12:49:10 +08:00
2025-09-18 12:49:10 +08:00

Workflow

Project Overview

This is the workflow graph engine module of Dify, implementing a queue-based distributed workflow execution system. The engine handles agentic AI workflows with support for parallel execution, node iteration, conditional logic, and external command control.

Architecture

Core Components

The graph engine follows a layered architecture with strict dependency rules:

  1. Graph Engine (graph_engine/) - Orchestrates workflow execution

    • Manager - External control interface for stop/pause/resume commands
    • Worker - Node execution runtime
    • Command Processing - Handles control commands (abort, pause, resume)
    • Event Management - Event propagation and layer notifications
    • Graph Traversal - Edge processing and skip propagation
    • Response Coordinator - Path tracking and session management
    • Layers - Pluggable middleware (debug logging, execution limits)
    • Command Channels - Communication channels (InMemory, Redis)
  2. Graph (graph/) - Graph structure and runtime state

    • Graph Template - Workflow definition
    • Edge - Node connections with conditions
    • Runtime State Protocol - State management interface
  3. Nodes (nodes/) - Node implementations

    • Base - Abstract node classes and variable parsing
    • Specific Nodes - LLM, Agent, Code, HTTP Request, Iteration, Loop, etc.
  4. Events (node_events/) - Event system

    • Base - Event protocols
    • Node Events - Node lifecycle events
  5. Entities (entities/) - Domain models

    • Variable Pool - Variable storage
    • Graph Init Params - Initialization configuration

Key Design Patterns

Command Channel Pattern

External workflow control via Redis or in-memory channels:

# Send stop command to running workflow
channel = RedisChannel(redis_client, f"workflow:{task_id}:commands")
channel.send_command(AbortCommand(reason="User requested"))

Layer System

Extensible middleware for cross-cutting concerns:

engine = GraphEngine(graph)
engine.layer(DebugLoggingLayer(level="INFO"))
engine.layer(ExecutionLimitsLayer(max_nodes=100))

engine.layer() binds the read-only runtime state before execution, so layer hooks can assume graph_runtime_state is available.

Event-Driven Architecture

All node executions emit events for monitoring and integration:

  • NodeRunStartedEvent - Node execution begins
  • NodeRunSucceededEvent - Node completes successfully
  • NodeRunFailedEvent - Node encounters error
  • GraphRunStartedEvent/GraphRunCompletedEvent - Workflow lifecycle

Variable Pool

Centralized variable storage with namespace isolation:

# Variables scoped by node_id
pool.add(["node1", "output"], value)
result = pool.get(["node1", "output"])

Import Architecture Rules

The codebase enforces strict layering via import-linter:

  1. Workflow Layers (top to bottom):

    • graph_engine → graph_events → graph → nodes → node_events → entities
  2. Graph Engine Internal Layers:

    • orchestration → command_processing → event_management → graph_traversal → domain
  3. Domain Isolation:

    • Domain models cannot import from infrastructure layers
  4. Command Channel Independence:

    • InMemory and Redis channels must remain independent

Common Tasks

Adding a New Node Type

  1. Create node class in nodes/<node_type>/
  2. Inherit from BaseNode or appropriate base class
  3. Implement _run() method
  4. Register in nodes/node_mapping.py
  5. Add tests in tests/unit_tests/core/workflow/nodes/

Implementing a Custom Layer

  1. Create class inheriting from Layer base
  2. Override lifecycle methods: on_graph_start(), on_event(), on_graph_end()
  3. Add to engine via engine.layer()

Debugging Workflow Execution

Enable debug logging layer:

debug_layer = DebugLoggingLayer(
    level="DEBUG",
    include_inputs=True,
    include_outputs=True
)