1.13.0
langgenius/dify1.13.0Feb 11, 2026by QuantumGhost
AI Summary
Major release introducing Human-in-the-Loop (HITL) capabilities with a new Human Input node that allows workflows to pause for human review and approval. Includes significant architecture changes moving workflow-based streaming executions to Celery workers and introducing new Redis PubSub configurations for scalability.
Key Highlights
- Human Input node for workflow pausing with human review and approval
- New Celery queue workflow_based_app_execution required for streaming executions
- New Redis PubSub configurations (PUBSUB_REDIS_URL, PUBSUB_REDIS_CHANNEL_TYPE, PUBSUB_REDIS_USE_CLUSTERS)
- Dutch (nl-NL) language support added
- Plugin manifest pre-caching for improved performance
Breaking Changes
- New Celery queue workflow_based_app_execution must be added to custom CELERY_QUEUES
- Additional api_token queue required if ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK=true
- Large deployments should configure dedicated Redis for PubSub with sharded mode
New Features
- Human Input node with native workflow pausing
- Review & Edit UI for human modification of variables
- Action-based routing with custom buttons (Approve, Reject, Escalate)
- Delivery via Webapp or Email
- Global timeout for human input (default 7 days)
- MCP Tool usage metadata extraction and reporting
- Service API endpoint for end-user lookup
Full Release Notes
## 🚀 New Features ### Human-in-the-Loop (HITL) We are introducing the **Human Input** node, a major update that transforms how AI and humans collaborate within Dify workflows. **Background** Previously, workflows were binary: either fully automated or fully manual. This created a "trust gap" in high-stakes scenarios where AI speed is needed but human judgment is essential. With HITL, we are making h uman oversight a native part of the workflow architecture, allowing you to embed review steps directly into the execution graph. **Key Capabilities** - **Native Workflow Pausing:** Insert a "Human Input" node to suspend workflow execution at critical decision points. - **Review & Edit:** The node generates a UI where humans can review AI outputs and modify variables (e.g., editing a draft or correcting data) before the process continues. - **Action-Based Routing:** Configure custom buttons (like "Approve," "Reject," or "Escalate") that determine the subsequent path of the workflow. - **Flexible Delivery Methods:** Human input forms can be delivered via **Webapp** or **Email**. In cloud environments, Email delivery availability may depend on plan/feature settings. ## 🛠Architecture Updates To support the stateful pause/resume mechanism required by HITL and provide event‑subscription APIs, we refactored the execution engine: **Workflow‑based streaming executions and Advanced Chat executions now run in Celery workers**, while non‑streaming **WORKFLOW** runs still execute in the API process. All pause/resume paths (e.g., HITL) are resumed via Celery, and events are streamed back through Redis Pub/Sub. **For Large Deployments & Self-Hosted Users:** We have introduced a new Celery queue named `workflow_based_app_execution`. While standard setups will work out of the box, high-throughput environments should consider the following optimizations to ensure stability and performance: 1. **Scale Workers:** Adjust the number of workers consuming the `workflow_based_app_execution` queue based on your specific workload. 2. **Dedicated Redis (Optional):** For large-scale deployments, we recommend configuring the new `PUBSUB_REDIS_URL` environment variable to point to a dedicated Redis instance. Using **Redis Cluster mode with Sharded PubSub** is strongly advised to ensure horizontal scalability. ## ⚠️ Important Upgrade Note **New Celery Queue Required: `workflow_based_app_execution`** Please ensure your deployment configuration (Docker Compose, Helm Chart, etc.) includes workers listening to the new **`workflow_based_app_execution`** queue. This queue is required for workflow‑based streaming executions and all resume flows (e.g., HITL); otherwise, streaming executions and resume tasks will not be processed. ## 🔧 Operational Note **Additional Celery Queue: `api_token`** If `ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK=true`, ensure your deployment also has workers listening to **`api_token`**. This queue is used by the scheduled batch update task for API token `last_used_at` timestamps. ## ⚙️ Configuration Changes We have introduced several new environment variables to support the architectural changes. **Large deployments should pay special attention to the PubSub Redis configurations** to ensure scalability. * **`PUBSUB_REDIS_URL`** (Critical): Specifies the Redis URL used for PubSub communication between the API and Celery workers. If left empty, it defaults to the standard `REDIS_*` configuration. * **`PUBSUB_REDIS_CHANNEL_TYPE`** (Critical): Defines the channel type for streaming events. Options are `pubsub` (default) or `sharded`. **We highly recommend using `sharded` for high-throughput environments.** * **`PUBSUB_REDIS_USE_CLUSTERS`** (Critical): Set to `true` to enable Redis cluster mode for PubSub. Combined with sharded PubSub, this is essential for horizontal scaling. **Other Additions:** * `WEB_FORM_SUBMIT_RATE_LIMIT_MAX_ATTEMPTS`: Maximum number of web form submissions allowed per IP within the rate limit window (Default: `30`). * `WEB_FORM_SUBMIT_RATE_LIMIT_WINDOW_SECONDS`: Time window in seconds for web form submission rate limiting (Default: `60`). * `HUMAN_INPUT_GLOBAL_TIMEOUT_SECONDS`: Maximum seconds a workflow run can stay paused waiting for human input before global timeout (Default: `604800`, 7 days). * `ENABLE_HUMAN_INPUT_TIMEOUT_TASK`: Enables the background task that checks for expired human input requests (Default: `true`). * `HUMAN_INPUT_TIMEOUT_TASK_INTERVAL`: Sets the interval (in minutes) for the timeout check task (Default: `1`). * `ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK`: Enables the periodic background task that batch-updates API token `last_used_at` timestamps (Default: `true`). * `API_TOKEN_LAST_USED_UPDATE_INTERVAL`: Sets the interval (in minutes) for batch-updating API token `last_used_at` timestamps (Default: `30`). * `SANDBOX_EXPIRED_RECORDS_CLEAN_BATCH_MAX_INTERVAL`: Maximum random delay (in milliseconds) between retention cleanup batches to reduce DB pressure spikes (Default: `200`). ## 📌 Additional Changelog Highlights ### Reliability & Correctness - Added migration-time deduplication and a unique constraint for tenant default models to prevent duplicate default model records. - Fixed a tools-deletion edge case caused by provider ID type mismatch. - Fixed a FastOpenAPI integration regression where authenticated users could be resolved as anonymous in remote file APIs. - Fixed message event type detection for file-related responses, and hid the workspace invite action for non-manager users. ### Performance & Scalability - Reduced backend load and console latency with plugin manifest pre-caching and `AppListApi` query optimizations. - Improved large-data task stability with split DB sessions, batched cleanup execution, index tuning, and configurable inter-batch throttling for retention cleanup jobs. ### API & Platform Capabilities - Added a Service API endpoint for end-user lookup with tenant/app scope enforcement. - Improved workflow run history refresh behavior during run state transitions. - Enhanced MCP Tool integration by extracting and reporting usage metadata (for example, token/cost fields) from MCP responses. ### Security - Removed dynamic `new Function` evaluation from ECharts parsing and now return explicit parsing errors for unsupported chart code. ### Localization - Added Dutch (`nl-NL`) language support across backend language mapping and web localization resources. --- ## Upgrade Guide > [!IMPORTANT] > If you use custom `CELERY_QUEUES`, make sure `workflow_based_app_execution` is included. > If `ENABLE_API_TOKEN_LAST_USED_UPDATE_TASK=true`, also include `api_token`. > > For background and details, see **⚠️ Important Upgrade Note** and **🔧 Operational Note** above. ### Docker Compose Deployments 1. Back up your customized docker-compose YAML file (optional) ```bash cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak ``` 2. Get the latest code from the main branch ```bash git checkout main git pull origin main ``` 3. Stop the service. Please execute in the docker directory ```bash docker compose down ``` 4. Back up data ```bash tar -cvf volumes-$(date +%s).tgz volumes ``` 5. Upgrade services ```bash docker compose up -d ``` > [!NOTE] > > If you encounter errors like below > > ```bash > 2025/11/26 11:37:57 /app/internal/db/pg/pg.go:30 > [error] failed to initialize database, got error failed to connect to `host=db_postgres user=postgres database=dify_plugin`: hostname resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving) > > 2025/11/26 11:37:57 /app/internal/db/pg/pg.go:34 > [error] failed to initialize database, got error failed to connect to `host=db_postgres user=postgres database=postgres`: hostname > resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving) > 2025/11/26 11:37:57 init.go:99: [PANIC]failed to init dify plugin db: failed to connect to `host=db_postgres user=postgres database=postgres`: hostname resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving) > panic: [PANIC]failed to init dify plugin db: failed to connect to `host=db_postgres user=postgres database=postgres`: hostname resolving error (lookup db_postgres on 127.0.0.11:53: server misbehaving) > ``` > Please use the following command instead. For details, please read this https://github.com/langgenius/dify/issues/28706 > ```bash > docker compose --profile postgresql up -d > ``` ### Source Code Deployments 1. Stop the API server, Worker, and Web frontend Server. 2. Get the latest code from the release branch: ```bash git checkout 1.13.0 ``` 3. Update Python dependencies: ```bash cd api uv sync ``` 4. Then, let's run the migration script: ```bash uv run flask db upgrade ``` 5. Finally, run the API server, Worker, and Web frontend Server again. --- ## What's Changed * refactor(api): replace reqparse with Pydantic models in trial.py by @Sean-Kenneth-Doherty in https://github.com/langgenius/dify/pull/31789 * refactor: plugin detail panel components for better maintainability and code organization. by @CodingOnStar in https://github.com/langgenius/dify/pull/31870 * fix: remove api reference doc link en prefix by @hyoban in https://github.com/langgenius/dify/pull/31910 * fix: missing import console_ns by @hjlarry in https://github.com/langgenius/dify/pull/31916 * fix: fix mcp server status is not right by @fatelei in https://github.com/langgenius/dify/pull/31826 * test: try fix test, clear test log in CI by @hyoban in https://github.com/langgenius/dify/pull/31912 * fix: fix mcp output schema is union type frontend crash by @fatelei in https://github.com/langgenius/dify/pull/31779 * fix: auto summary env by @zxhlyh in https://github.com/langgenius/dify/pull/31930 * refactor(datasets): extract hooks and components with comprehensive tests by @CodingOnStar in https://github.com/langgenius/dify/pull/31707 * fix: include locale in appList query key for localization support inuseExploreAppList by @CodingOnStar in https://github.com/langgenius/dify/pull/31921 * chore: assign code owners for test directories by @laipz8200 in https://github.com/langgenius/dify/pull/31940 * refactor(web): extract complex components into modular structure with comprehensive tests by @CodingOnStar in https://github.com/langgenius/dify/pull/31729 * fix: fix delete_draft_variables_batch cycle forever by @fatelei in https://github.com/langgenius/dify/pull/31934 * chore: bump version in docker-compose and package manager to 1.12.1 by @QuantumGhost in https://github.com/langgenius/dify/pull/31947 * chore: update CODEOWNERS to specify test file patterns for base components by @CodingOnStar in https://github.com/langgenius/dify/pull/31941 * feat: use latest hash to sync draft by @fatelei in https://github.com/langgenius/dify/pull/31924 * fix: remove staleTime/gcTime overrides from trigger query hooks and use orpc contract by @lyzno1 in https://github.com/langgenius/dify/pull/31863 * feat: account delete cleanup by @GareArc in https://github.com/langgenius/dify/pull/31519 * test: fix test by @hyoban in https://github.com/langgenius/dify/pull/31975 * fix: fix miss use db.session by @fatelei in https://github.com/langgenius/dify/pull/31971 * chore: sticky the applist header in explore page by @iamjoel in https://github.com/langgenius/dify/pull/31967 * fix(web): add rewrite rule to fix Serwist precaching 404 errors by @majiayu000 in https://github.com/langgenius/dify/pull/31770 * fix: fix uuid_generate_v4 only used in postgresql by @fatelei in https://github.com/langgenius/dify/pull/31304 * chore: migrate to eslint-better-tailwind by @hyoban in https://github.com/langgenius/dify/pull/31969 * feat: pre-cache all the plugin manifests before checking updates by @Stream29 in https://github.com/langgenius/dify/pull/31942 * perf(api): Optimize the response time of AppListApi endpoint by @QuantumGhost in https://github.com/langgenius/dify/pull/31999 * chore: Remove redundant double space in variable type description (core/variables/variables.py) by @WH-2099 in https://github.com/langgenius/dify/pull/32002 * refactor: strip external imports in workflow template transform by @WH-2099 in https://github.com/langgenius/dify/pull/32017 * chore: remove .codex/skills directory by @longway-code in https://github.com/langgenius/dify/pull/32022 * fix: fix agent node tool type is not right by @fatelei in https://github.com/langgenius/dify/pull/32008 * fix: make `flask upgrade-db` fail on error by @longbingljw in https://github.com/langgenius/dify/pull/32024 * chore: update HITL auto deploy workflow by @QuantumGhost in https://github.com/langgenius/dify/pull/32040 * fix: fix tool type is miss by @fatelei in https://github.com/langgenius/dify/pull/32042 * perf: use batch delete method instead of single delete by @QuantumGhost in https://github.com/langgenius/dify/pull/32036 * fix(api): return proper HTTP 204 status code in DELETE endpoints by @NeatGuyCoding in https://github.com/langgenius/dify/pull/32012 * test: only remove text coverage in CI by @hyoban in https://github.com/langgenius/dify/pull/32043 * chore: update deploy branches for deploy-hitl.yaml by @QuantumGhost in https://github.com/langgenius/dify/pull/32051 * fix: redis for api token by @zyssyz123 in https://github.com/langgenius/dify/pull/31861 * fix: batch delete document db session block by @JohnJyong in https://github.com/langgenius/dify/pull/32062 * fix: remove unexpected scrollbar in KB Retrieval settings by @crazywoola in https://github.com/langgenius/dify/pull/32082 * refactor: remove unnecessary type: async_workflow_service.py by @kongdayan in https://github.com/langgenius/dify/pull/32081 * refactor: partition Celery task sessions into smaller, discrete execu… by @fatelei in https://github.com/langgenius/dify/pull/32085 * feat: extract mcp tool usage by @fatelei in https://github.com/langgenius/dify/pull/31802 * fix: search model provider list by @zxhlyh in https://github.com/langgenius/dify/pull/32106 * refactor: document_indexing_update_task split database session by @fatelei in https://github.com/langgenius/dify/pull/32105 * test: stable test by @hyoban in https://github.com/langgenius/dify/pull/32108 * refactor: decouple database operations from knowledge retrieval nodes by @fatelei in https://github.com/langgenius/dify/pull/31981 * feat: Service API - add end-user lookup endpoint by @BeautyyuYanli in https://github.com/langgenius/dify/pull/32015 * fix: pass user timezone from app context to the date picker component. by @ZeroZ-lab in https://github.com/langgenius/dify/pull/31831 * fix: fix trigger output schema miss by @fatelei in https://github.com/langgenius/dify/pull/32116 * feat: Human Input Node by @QuantumGhost in https://github.com/langgenius/dify/pull/32060 * chore(api): update launch.json.template by @QuantumGhost in https://github.com/langgenius/dify/pull/32124 * style: update banner item styles and enhance dark/light theme variables by @Yessenia-d in https://github.com/langgenius/dify/pull/32111 * chore: fix type for useTranslation in `#i18n` by @hyoban in https://github.com/langgenius/dify/pull/32134 * refactor: document_indexing_sync_task split db session by @fatelei in https://github.com/langgenius/dify/pull/32129 * fix(api): register knowledge pipeline service API routes by @tokezooo in https://github.com/langgenius/dify/pull/32097 * fix(api): serialize pipeline file-upload created_at by @tokezooo in https://github.com/langgenius/dify/pull/32098 * chore: detect utilities in css by @hyoban in https://github.com/langgenius/dify/pull/32143 * chore: introduce css icons by @hyoban in https://github.com/langgenius/dify/pull/32004 * refactor(api): tighten OTel decorator typing by @shuv-amp in https://github.com/langgenius/dify/pull/32163 * fix(api): clean up orphaned pending accounts on member removal by @eureka928 in https://github.com/langgenius/dify/pull/32151 * fix: When the user is a non-sandbox user and has a paid balance, the … by @zyssyz123 in https://github.com/langgenius/dify/pull/32173 * refactor: import component css in globals.css by @hyoban in https://github.com/langgenius/dify/pull/32180 * fix(api): include file marker for workflow tool file outputs by @OiPunk in https://github.com/langgenius/dify/pull/32114 * fix(web): fill workflow tool output descriptions from schema by @OiPunk in https://github.com/langgenius/dify/pull/32117 * fix: replace sendBeacon with fetch keepalive for autosave on page close by @veeceey in https://github.com/langgenius/dify/pull/32088 * test: add comprehensive tests for Human Input Node functionality by @WTW0313 in https://github.com/langgenius/dify/pull/32191 * chore(api): update launch.json.example to include new workflow_based_app_execution. by @Nov1c444 in https://github.com/langgenius/dify/pull/32184 * refactor: extract sub-components and custom hooks from UpdateDSLModal and Metadata components by @CodingOnStar in https://github.com/langgenius/dify/pull/32045 * fix: fix no dify home directory lead permission error by @fatelei in https://github.com/langgenius/dify/pull/32169 * refactor: type safe env, update to zod v4 by @hyoban in https://github.com/langgenius/dify/pull/32035 * feat: enhancement celery configuration by @ruanimal in https://github.com/langgenius/dify/pull/32145 * fix(console): keep conversation updated_at unchanged when marking read by @OiPunk in https://github.com/langgenius/dify/pull/32133 * chore: allow draft run single node without connect to other node by @hjlarry in https://github.com/langgenius/dify/pull/31977 * chore(deps): bump axios from 1.13.2 to 1.13.5 in /sdks/nodejs-client by @dependabot[bot] in https://github.com/langgenius/dify/pull/32199 * fix: Fix the display of state icon of base node by @WTW0313 in https://github.com/langgenius/dify/pull/32208 * chore(api): consume tasks in `workflow_based_app_execution` queue in start-worker script by @QuantumGhost in https://github.com/langgenius/dify/pull/32214 * fix(api): excessive high CPU usage caused by RedisClientWrapper by @QuantumGhost in https://github.com/langgenius/dify/pull/32212 * fix: fix all tools is deleted by @fatelei in https://github.com/langgenius/dify/pull/32207 * fix: add unique constraint to tenant_default_models to prevent duplic… by @qiaofenlin in https://github.com/langgenius/dify/pull/31221 * feat: support nl-NL language by @fatelei in https://github.com/langgenius/dify/pull/32216 * fix: fix get_message_event_type return wrong message type by @fatelei in https://github.com/langgenius/dify/pull/32019 * docs(api): mark SetupApi as unauthenticated by design by @41tair in https://github.com/langgenius/dify/pull/32224 * feat(workflow): enhance workflow run history management and UI updates by @WTW0313 in https://github.com/langgenius/dify/pull/32230 * chore(deps): bump cryptography from 46.0.3 to 46.0.5 in /api by @dependabot[bot] in https://github.com/langgenius/dify/pull/32218 * chore(deps): bump google-api-python-client from 2.90.0 to 2.189.0 in /api by @dependabot[bot] in https://github.com/langgenius/dify/pull/32102 * feat(tests): add mock for useInvalidateWorkflowRunHistory in pipeline run tests by @WTW0313 in https://github.com/langgenius/dify/pull/32234 * fix: fix use fastopenapi lead user is anonymouse by @fatelei in https://github.com/langgenius/dify/pull/32236 * fix: update index to optimize message clean performance by @hj24 in https://github.com/langgenius/dify/pull/32238 * fix: hide invite button if current user is not workspace manager by @douxc in https://github.com/langgenius/dify/pull/31744 * chore: bump version to 1.13.0 by @QuantumGhost in https://github.com/langgenius/dify/pull/32147 ## New Contributors * @Sean-Kenneth-Doherty made their first contribution in https://github.com/langgenius/dify/pull/31789 * @WH-2099 made their first contribution in https://github.com/langgenius/dify/pull/32002 * @longway-code made their first contribution in https://github.com/langgenius/dify/pull/32022 * @kongdayan made their first contribution in https://github.com/langgenius/dify/pull/32081 * @tokezooo made their first contribution in https://github.com/langgenius/dify/pull/32097 * @shuv-amp made their first contribution in https://github.com/langgenius/dify/pull/32163 * @OiPunk made their first contribution in https://github.com/langgenius/dify/pull/32114 * @veeceey made their first contribution in https://github.com/langgenius/dify/pull/32088 **Full Changelog**: https://github.com/langgenius/dify/compare/1.12.1...1.13.0