Releases: langgenius/dify
Release list
Release v1.16.1 - Bug Fixes and Security Enhancements
What's Changed
New Features
Tool Multi-Select Input
- Workflow tool nodes now support multi-select dropdown inputs, allowing users to choose multiple values from a predefined list when configuring tool parameters. (#39346)
Workflow Node Locator
- You can now click a node_id in workflow run logs or error messages to locate and highlight the corresponding node in the workflow editor canvas. (#38187)
Workflow Block Selector Improvements
- The block selector panel now features improved keyboard navigation, category previews, and a more intuitive search experience when adding nodes to workflows. (#39212)
Export Agent DSL from Sidebar
- Agent apps can now be exported as DSL YAML directly from the app sidebar menu, making it easy to back up or version-control agent configurations. (#39299)
Knowledge Tracing
- Added more observability traces to knowledge/RAG document processing operations, improving visibility into indexing pipelines. (#38959)
Bug Fixes
Workflow & Collaboration
- Fixed hidden-tab collaboration leader saving stale drafts when the tab is inactive (#38997)
- Fixed unsaved edits being dropped when collaboration never connects (#39579)
- Preserved latest collaboration session after reconnection (#39646)
- Fixed false draft save error during Strict Mode initialization (#39353)
- Show persistent error notification when workflow draft save fails (#39293)
- Wait for workflow worker threads to finish before Celery tasks complete, preventing orphaned executions (#39614)
- Lazy-load Loro collaboration runtime to reduce initial bundle size (#39631)
- Don't open node settings panel when clicking a node in comment mode (#39500)
- Don't close active comment panel when a different comment is resolved (#39491)
RAG & Knowledge
- Fixed document cleaner stripping valid characters ï (U+00EF), ¿ (U+00BF), ¾ (U+00BE) (#39215)
- Preserved spaces during recursive text splitting (#39498)
- Used
flush()instead ofcommit()in dataset service to preserve caller transaction boundaries (#39223) - Sent valid body in external knowledge validation probe (#39410)
Agent
- Fixed agent preview: start new Preview conversations without inheriting an old ID (#39463)
- Fixed agent chat input being replaced when conversation history updates (#39289)
- Preserved complete model usage pricing in agent logs (#39201)
- Show workflow node runs in agent execution logs (#39471)
- Include workflow runs in agent monitoring stats (#39354)
- Block unpublished agents from being used in workflows (#39532)
- Prevent agent preview actions from being clipped (#39510)
- Prevent build reset from clearing preview chat history (#39490)
- Fixed agent build draft UI flashing during apply (#39642)
Web App & UI
- Fixed webapp JWT expiration time being incorrectly set (#39537)
- Fixed TTS playback in Safari and Firefox (#39444)
- Fixed clipboard writes failing in embedded apps (#39511)
- Fixed text generation web app showing infinite loading after timeout (#39268)
- Fixed chat not passing document if model doesn't support vision (#39461)
- Stopped chunk length/overlap inputs collapsing to unusable width in narrow containers (#39600)
- Fixed search hotkey hydration mismatch (#39574)
- Improved DSL import/export dialog states (#39432, #39409)
- Fixed basePath doubling in auth refresh redirects (#39273)
- Show unavailable state for disabled Web Apps (#39392)
- Fixed permission selector semantics (#39269)
- Fixed customization page horizontal overflow (#39557)
API & Backend
- Fixed MCP tool
output_schemabeing treated as required when it's optional (#39453) - Honored array-element limit and byte budget for
list[File]in VariableTruncator (#39220) - Prevented identity logging deadlock (#39449)
- Rejected
host:port-shapedPLUGIN_REMOTE_INSTALL_PORTvalues with an actionable hint (#39329) - Fixed
PaginatedResult.pagesreturning 1 instead of 0 for empty result sets (#39229) - Used resource tenant for draft variable files (#39307)
- Scoped HITL snapshot message lookup to utilize database index (#39351)
- Returned 400 instead of 500 when
filefield is missing from audio-to-text endpoints (#39303, #39322) - Fixed tool_meta missing
tool_provider_typeduring tool execution (#39513) - Applied configured timeout to enterprise inner API requests (#39335)
- Returned disabled auto-upgrade settings when strategy is missing (#39494)
- Enforced tool provider type contracts (#39380)
- Fixed WaterCrawl website crawler handling non-JSON error responses (#37514)
- Fixed can't create chat app when tenant default model schema errors (#39266)
Security Enhancements
- The Agent local sandbox now runs behind a dedicated Squid forward proxy with strict ACL rules, preventing the sandbox from reaching internal services directly. Only the
/files/endpoint on the API and/agent-stub/on agent_backend are permitted, both protected with short-lived access tokens. This significantly reduces the blast radius of arbitrary code execution in the agent sandbox. (#39544) - Communication between the Dify API and the agent backend now uses token-based authentication via
DIFY_AGENT_API_TOKEN/AGENT_BACKEND_API_TOKEN, hardening the internal service boundary. (#39622) - Switched Jinja2 template rendering to use
SandboxedEnvironment, preventing template injection attacks in workflow code nodes (#39609) - Patched React Server Components DoS vulnerability (#39539)
- Used
re.fullmatchin email validator to reject trailing newlines, preventing bypass attacks (#39320) - Validated account status before accepting workspace invitations (#39438)
Performance
- Lightweight recent apps endpoint — New
GET /console/api/apps/recentendpoint reduces the home page "Continue Work" section latency by ~69% (3.2× faster), cutting SQL queries from 19+ to 1 projection SELECT and response size by ~50% (#39625) - Lazy-load Home creation modals — Deferred loading of creation modal code until interaction, reducing initial JavaScript bundle (#39634)
Improvements
- Made agent composer save and publish state consistent (#39637)
- Simplified Dify logo theming (#39580)
- Improved workflow block selector UI (#39377)
- Improved web accessibility semantics (#39505)
- Nodes are no longer draggable when previewing a workflow (#39131)
- Display non-LLM settings in integration tool details (#39295)
Environment Variable Changes
New Variables
| Variable | Default | Description |
|---|---|---|
DIFY_AGENT_API_TOKEN |
dify-agent-run-token-for-dev-only |
Shared bearer token for API → agent_backend authentication. Change this in production. |
AGENT_BACKEND_API_TOKEN |
dify-agent-run-token-for-dev-only |
Same token on the agent backend side. Must match DIFY_AGENT_API_TOKEN. |
PLUGIN_MODEL_PROVIDERS_CACHE_ENABLED |
true |
Set to false if plugins are installed externally and the cache cannot be invalidated. |
Important
DIFY_AGENT_API_TOKEN is a new required variable for secure communication between the Dify API and agent backend. The default value (dify-agent-run-token-for-dev-only) is insecure and must be replaced in production. Generate one with:
python -c 'import secrets; print(secrets.token_urlsafe(32))'Set the same value as AGENT_BACKEND_API_TOKEN on the agent backend side.
Docker Compose Changes
- Agent sandbox network isolation:
local_sandboxis moved off thedefaultnetwork to dedicatedagent_sandbox_network+local_sandbox_proxy_network. A newagent_ssrf_proxyservice (Squid) is added. - Bearer auth:
AGENT_BACKEND_API_TOKEN/DIFY_AGENT_API_TOKENare now passed toapi,worker, andagent_backendservices. - Image tags updated to
1.16.1.
Database Migrations
This release includes 4 new migrations:
2026_07_15_1600-3c9f8e2a1d7b_add_workflow_run_archive_bundle_cursor_indexes.py— Add indexes toworkflow_run_archive_bundles(concurrent on PostgreSQL)2026_06_29_1200-b8c9d0e1f2a3_add_step_by_step_tour_state.py— Createaccount_step_by_step_tour_statestable2026_07_22_1500-d2825e7b9c10_scope_agent_debug_conversations.py— Adddraft_typecolumn toagent_debug_conversationsand update unique constraint2026_07_23_1200-6f5a9c2d8e1b_add_telemetry_fields_to_dify_setups.py— Add telemetry fields (instance_id,install_reported_at,last_heartbeat_at) todify_setups
All migrations are additive (new tables, columns, indexes) and are safe to run without downtime.
Upgrade Guide
Docker Compose (Recommended)
cd docker
docker compose down
git pull origin main
docker compose pull
docker compose up -dThe database migrations will run automatically on startup.
Important
Review the new DIFY_AGENT_API_TOKEN variable in .env. The default value is insecure — generate a secure token for production:
python -c 'import secrets; print(secrets.token_urlsafe(32))'Source Code
git pull origin main
cd api
flask db upgradeWhat's Changed
- refactor(web): use generated dataset card queries by @lyzno1 in #39203
- refactor(web): use generated OAuth query options by @lyzno1 in #39204
- refactor(web): align integrations sidebar components by @lyzno1 in #39202
- feat(workflow): improve block selector navigation and previews by @lyzno1 in #39212
- fix(dataset_service): use flush() instead of commit() to preserve caller transaction by @sergioperezcheco in #39223
- ci: route default Depot jobs to 4-core runners by @l...
v1.16.0
Introducing Dify Agent (Beta): A New Agent Experience in Dify
Warning
You should provide Dify Agent services
As many of you know, the shell-based LLM agent paradigm has brought a major leap in agent capabilities and changed how we think about agents. Meanwhile, Skills provide a standardized way to package and distribute capabilities, making it easier to build powerful agents.
Today, we are launching Dify Agent. Like other leading agents, it runs in a Linux sandbox. This release includes:
-
A builder for creating Dify Agents
- You can build Dify Agents through the UI: set a base prompt, upload Skills and files, and connect tools and knowledge from the Dify ecosystem.
- We also provide an agent that helps you build Dify Agents. Through conversation, it can configure the Linux sandbox environment, install required packages, and create new Skills and files that your Dify Agent can use later.
-
Dify Workflow integration for Dify Agent
- You can use an existing Dify Agent in a Dify Workflow, or temporarily create an inline Dify Agent. It will execute the task defined by the workflow node, generate the required output, and pass it to the next node.
-
A new web app experience
- The Dify Agent you build can be published and used as a web app. While the user experience remains familiar, it is now powered by Dify Agent.
Docs: https://docs.dify.ai/en/self-host/use-dify/build/new-agent/overview
⚠️ Action Required
OpenAI GPT-5.6 Compatibility Notice
The OpenAI plugin previously defaulted to using the Chat Completions API, which was deprecated by OpenAI earlier this year and has increasingly poor support for newer model series. The newly released GPT-5.6 family has many unusual and unique parameter combination restrictions when used with Chat Completions, because OpenAI now provides only minimal compatibility support for Chat Completions with new models. This is not a Dify system issue.
The default API type for new configurations has been changed from Chat Completions to Responses. However, users who previously saved a custom API key with the old default (Chat Completions) will retain that setting, which may cause unexpected errors that appear to originate from Dify.
If you have previously configured a custom OpenAI API key, please check your API type setting and switch to Responses if it is still set to Chat Completions, especially when using GPT-5.6 or later models.
New Features
Agent App (Open Beta)
- Agent App enters open beta and is now enabled by default for all users. It introduces a built-in sandbox for code execution and shell commands, a skill system that lets agents call tools and APIs, an agent roster for managing and reusing agents across a workspace, and support for referencing new agents from workflow agent nodes.
Smarter AI Workflow Generation
- The ⌘K → /create and /refine AI workflow generator has been enhanced end-to-end: the low-value "Ideal output" field was removed, static example chips replaced with AI-generated suggestions grounded in your workspace context, and node config generation is now parallelized for faster results. A configurable timeout (
WORKFLOW_GENERATION_TIMEOUT_MS, default 180s) prevents long-running generations from hanging.
MCP Protocol Upgrade
- The workflow-as-MCP server now supports MCP protocol 2025-06-18 with version negotiation and structured tool output, while remaining backward compatible with older clients. MCPClient connections can now inject dynamic HTTP request headers at runtime using placeholders (e.g.
{{request.headers.X-Custom-Auth}}), enabling per-request authentication passthrough.
Web App Customization
- App owners can now customize the chat input placeholder text (up to 64 chars) for Chatbot, Agent, and Chatflow web apps. The customization UI has been refined with clearer naming ("Custom Frontend" / "Branding") and better label handling. App descriptions are now displayed on chat and text-generation app screens with a collapsible view to avoid pushing the input form off screen.
Workflow Reliability & Operations
- Workflow run archives can now be exported, and active runs are properly aborted during Celery warm shutdown to prevent orphaned tasks. Redis connections are more resilient with TCP keepalive support and expanded retry coverage. Model providers now receive
app_idfor provider-side cost attribution (e.g. Bedrock requestMetadata, OpenAI metadata, Vertex AI labels). OAuth and SSO login flows now preserve redirect URLs more reliably, with a dedicated error view for failed SSO completions.
Bug Fixes
Workflow & Agent
- Fixed multiple issues with workflow draft imports losing references, node settlement after failures, retry detail visibility, and HITL resume state restoration
- Fixed SSE stream corruption with Unicode separators, agent final answer clearing after stream completion, and conversation title being overwritten with empty values
- Fixed workflow archive retry hardening, multi-worker collaboration support, and chat tree out-of-order parent nodes
- Fixed knowledge retrieval failures not being surfaced to users, and End output variable name collisions in built-in templates
Authentication & Access Control
- Fixed open redirect vulnerabilities in post-login and auth redirect flows
- Fixed login redirects not staying on current deployment, auth prefix duplication, and change email not working
- Fixed editor permission issues: editors can now view logs, no longer query billing subscriptions, and can no longer manage members
- Fixed trace config changes not requiring edit access, and trial app access hardening for recommended apps
Models & Plugins
- Fixed custom model cache not being cleared on deletion, model plugin debugging failures, and Xinference credential context handling
- Fixed max token params not being disableable in follow-up model parameters
- Fixed plugin provider cache stampedes, marketplace installation callbacks, and plugin permission settings
Web & UI
- Fixed app creation from Learn Dify, node search field input, workspace avatar consistency, and navigation profile display
- Fixed Streamdown fullscreen table actions, marketplace page header jitter, and install dialog accessibility
- Fixed chat attachments scrolling out of view, HITL input save button visibility, and app card meta overflow
- Fixed monitoring chart zero-value display, member invitation state handling, dark mode background, and Unicode characters in form field names
- Fixed markdown file-preview link downloads, Notion sync empty state, and blog UTM attribution under CSP
Other
- Fixed infinite loop in batch document deletion, invalid UTF-8 cache payloads, and swallowed document indexing errors
- Fixed PostgreSQL 18 native uuidv7() support and ADB-PG 7.0 compatibility
- Fixed
CAN_REPLACE_LOGOdefaulting to true, unsupported language errors in execute_code, and CLI--insecureflag not skipping TLS verification
Improvements
Performance
- Eliminated N+1 queries in advanced-chat workflow run lists and TokenBufferMemory message file loading
- Faster frontend startup via lazy-loaded Vite plugins and console contract shards
- Reduced database load by caching setup status, compressing large plugin model objects in Redis with zstd, and retrieving published workflows via direct foreign key
Architecture & Code Quality
- Migrated all console API endpoints to generated OpenAPI contracts with BaseModel, and frontend console contracts to generated routes and types
- Propagated explicit database sessions across backend paths for consistency and testability
- Replaced legacy app context providers with Jotai atoms across the frontend
- Upgraded to TypeScript 7 and Vite+ toolchain, enforced strict ESLint rules, and disallowed new direct SQLAlchemy in controllers
Security Enhancements
This release includes several security hardening fixes, some of which were addressed after the 1.16.0-rc1 release:
- SQL injection: Closed a SQL injection vulnerability and enhanced SQL query safety with metadata key validation
- SSRF: Fixed an SSRF bypass via raw
httpx.getin API tool schema fetch - Open redirects: Prevented open redirects in post-login and auth redirect flows
- Sandbox enforcement: Chatflow API now checks workflow_id and sandbox plan; sandbox plan will not execute special workflows
- Landlock protection: Agent HOME directory protected with Landlock; downgraded to v1 for broader kernel compatibility
- CVE dependency upgrades: httplib2, setuptools, wandb; python-engineio, python-socketio; fickling, pillow, click
Environment Variable Changes
Added
| Variable | Default | File | Description |
|---|---|---|---|
AGENT_BACKEND_BASE_URL |
http://localhost:5050 |
api/.env.example |
Base URL for the Agent backend service |
AGENT_BACKEND_STREAM_READ_TIMEOUT_SECONDS |
30 |
api/.env.example |
Stream read timeout for Agent backend |
AGENT_BACKEND_STREAM_MAX_RECONNECTS |
3 |
api/.env.example |
Max reconnection attempts for Agent backend streams |
AGENT_BACKEND_RUN_TIMEOUT_SECONDS |
1200 |
api/.env.example |
Overall run timeout for Agent backend |
API_WEBSOCKET_WORKER_AMOUNT |
1 |
docker/envs/core-services/shared.env.example |
Number of WebSocket API workers |
DIFY_AGENT_REDIS_URL |
(empty, derived from REDIS_PASSWORD) |
docker/envs/core-services/dify-agent.env.example |
Redis URL for Dify Agent |
DIFY_AGENT_REDIS_PREFIX |
dify-agent |
docker/envs/core-services/dify-agent.env.example |
Redis key prefix for Dify Agent |
DIFY_AGENT_SHUTDOWN_GRACE_SECONDS |
30 |
`docker/envs/core-... |
v1.16.0-rc1
Introducing Dify Agent (Experimental): A New Agent Experience in Dify
Warning
You should provide Dify Agent services
As many of you know, the shell-based LLM agent paradigm has brought a major leap in agent capabilities and changed how we think about agents. Meanwhile, Skills provide a standardized way to package and distribute capabilities, making it easier to build powerful agents.
Today, we are experimentally launching Dify Agent. Like other leading agents, it runs in a Linux sandbox. This release includes:
-
A builder for creating Dify Agents
- You can build Dify Agents through the UI: set a base prompt, upload Skills and files, and connect tools and knowledge from the Dify ecosystem.
- We also provide an agent that helps you build Dify Agents. Through conversation, it can configure the Linux sandbox environment, install required packages, and create new Skills and files that your Dify Agent can use later.
-
Dify Workflow integration for Dify Agent
- You can use an existing Dify Agent in a Dify Workflow, or temporarily create an inline Dify Agent. It will execute the task defined by the workflow node, generate the required output, and pass it to the next node.
-
A new web app experience
- The Dify Agent you build can be published and used as a web app. While the user experience remains familiar, it is now powered by Dify Agent.
Docs: https://docs.dify.ai/en/self-host/use-dify/build/new-agent/overview
Limitations
Please note that in the current experimental release, all Dify Agents run in the same sandbox. This means:
- Under normal circumstances, each Dify Agent configures its environment and executes tasks within its own workspace without interfering with others.
- However, with simple instructions, any Dify Agent can read or interfere with the environments and data of other Dify Agents, including user data.
Strict isolation will be implemented in a future release. For now,
Warning
You should provide Dify Agent services
Similarly, because Dify Agent is not fully ready yet, you may find that some features are not available for Dify Agent. For example, Dify Workflow DSL export is unavailable when the workflow contains nodes that reference Dify Agent.
Upgrade Guide
Important
- This release includes new database migrations. Run them as part of the upgrade.
- Environment variables changed. Review the Environment Variable Changes section and update your
.envaccordingly. - Docker Compose configuration files changed. If you maintain a customized
docker-compose.yaml, review the changes and re-apply local customizations carefully.
Docker Compose Deployments
- Back up your customized docker-compose YAML and env files.
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak cp .env .env.$(date +%s).bak 2>/dev/null || true
- Get the latest code for the
1.16.0-rc1release.git fetch --tags git checkout 1.16.0-rc1
- Stop the services (run inside the
dockerdirectory).docker compose down
- Back up data.
tar -cvf volumes-$(date +%s).tgz volumes - Review any env file changes and re-apply local customizations.
- Upgrade services.
docker compose up -d
Source Code Deployments
- Stop the API server, Worker, and Web frontend server.
- Get the latest code for the
1.16.0-rc1release.git fetch --tags git checkout 1.16.0-rc1
- Update Python dependencies.
cd api uv sync - Run database migrations.
uv run flask db upgrade
- Restart the API server, Worker, and Web frontend server. To experiment with the new agent feature, you also need to start dify-agent and shellctl. Important: shellctl does not include built‑in authentication — for security, it is strongly recommended to run it inside a container.
What's Changed
- chore(api): surface pyrefly output on type-check failures by @QuantumGhost in #37934
- test: replace logger mock with caplog in workflow collaboration test by @ojasarora77 in #37971
- ci: emit pyrefly diagnostics as GitHub workflow commands by @ojasarora77 in #37974
- refactor(api): migrate response contract tooling to BaseModel by @cqjjjzr in #37950
- fix(cli): use a(n) article in difyctl prerelease warning by @GareArc in #37976
- fix(api): require edit access for trace config changes by @laipz8200 in #37973
- feat(webapp): display app description on chat and text-generation app screens by @kurokobo in #37345
- fix: decouple deployment access control dialog by @hyoban in #37936
- refactor(tests): use caplog in workflow collaboration service tests (#37468) by @hikariming in #37991
- fix(web): make marketplace URL builder SSR-safe by @lyzno1 in #37944
- refactor: simplify deployment access ownership by @hyoban in #37994
- refactor: Use pytest caplog instead of logger patching in test_spec.py by @DevCube24 in #37997
- refactor: align deployment detail state ownership by @hyoban in #38008
- fix: isolate node selector keyboard events by @lyzno1 in #37998
- fix(web): keep HITL input-field save button visible in the edit dialog by @manan-tech in #38007
- refactor(api): enforce enums over string literals on openapi surface by @GareArc in #38009
- chore: migrate account role test to testcontainers by @escape0707 in #38010
- refactor: pass db session into service calls (#37403) by @xiejl001 in #38016
- feat(api): cache workflow provider configurations by @linw1995 in #37980
- fix(web): capture blog UTM/slug attribution reliably under CSP by @CodingOnStar in #38022
- fix: plugin installation task popover layout when some failed too long by @hjlarry in #38000
- feat(web): add customizable input placeholder for Agent/Chatflow/Chatbot web app by @CyberPU2099 in #37790
- refactor: replace patch logger with caplog in test_version.py by @EvanYao826 in #38029
- docs(web): fix testing guide link by @Harsh23Kashyap in #38006
- feat(agent-v2): sync nightly updates to main (2026-06-25) by @BeautyyuYanli in #37915
- chore: inject session by @asukaminato0721 in #37941
- fix(web): download markdown file-preview links as attachments by @uxgnod in #38030
- chore(i18n): sync translations with en-US by @github-actions[bot] in #38035
- fix: remove aria-busy from loading button by @lyzno1 in #38036
- fix: improve members role chip accessibility by @lyzno1 in #38037
- fix: improve workflow run archive idempotency and batching by @41tair in #38027
- refactor(web): organize deployment feature state by @hyoban in #38065
- fix: prevent exiting toasts from blocking page clicks by @lyzno1 in #38063
- fix: gate deployments in route layout by @lyzno1 in #38078
- refactor: shell provider protocol by @wylswz in #38077
- fix: simplify scroll area composition by @lyzno1 in #38113
- fix(web): improve main nav focus outline by @lyzno1 in #38114
- fix: CAN_REPLACE_LOGO should be false by @fatelei in #38126
- chore: update deps by @hyoban in #38128
- chore: downgrade openapi-ts by @hyoban in #38141
- fix: support Unicode characters in form field names by @WTW0313 in #38138
- feat: refine snippet siderbar and support RBAC. by @FFXN in #38134
- fix(web): align web app nav item width by @lyzno1 in #38146
- fix(api): isolate side-effect database writes by @lin-hongkuan in #37895
- fix(api): wire dedicated timeout into inner RBAC requests by @GareArc in #38150
- fix: multimodal segment attachment indexing by @Blackoutta in #38080
- fix: agent app log detail modal not display well by @hjlarry in #38014
- fix(vdb): remove deprecated SQL options for ADB-PG 7.0 compatibility by @shiyuanfang2nd in #38004
- fix: editor should not query billing subscriptions by @hjlarry in #38157
- perf(api): retrieve published workflows via app.workflow_id by @linw1995 in https://github.com/langgenius/...
1.15.0
Dify 1.15.0 Release Note
What's Changed
UX & UI Enhancements
- Redesigned landing / onboarding for an easier first-run experience (#37433, #37844, #37800)
- Faster navigation — improved "go to anything" palette and autofocused search inputs (#32130, #37175)
- Safer deletes — one-click confirmation before removing an app (#37263)
- Cleaner workflow editor with collapsible panels (#37276)
- Clearer notifications — consistent toasts that show long errors in full (#37382, #37581)
- More accessible — plugin permission hints, restored contact-us menu, skip-nav link, and keyboard focus polish (#37310, #37774, #37644)
New Features
difyctl — drive Dify from the command line (Docs)
- difyctl is a command-line client for Dify: you can now run apps and workflows straight from your terminal, so personal agents, scripts, and CI pipelines can invoke Dify workflows without opening the web UI (#37036)
- Install it on any platform (macOS, Linux, Windows) with a single command and no access token — binaries are published as public releases with checksum verification (#37036, #37454)
- Pass scoped environment variables to CLI tool runs, and get clearer, consistent error messages (including friendly rate-limit handling) across both difyctl and the
/openapi/v1API (#37324, #37285, #37313, #36896)
See CoT in Workflow & Chatflow & CLI
- Chat Flow / Workflow can now stream the model's reasoning into a dedicated live "thinking" panel while keeping the final answer clean and readable. The reasoning is preserved so it's still there after a page refresh, and the same reasoning is visible in CLI and workflow run previews (#37460, #37828)
Richer Human-in-the-Loop forms
- When a workflow pauses to ask a person for input, the form can now include dropdown selects and file / multi-file uploads — not just free text — so people can answer with structured choices and attachments (#36322)
Support for slow, long-running models
- Workflows can now use generation models that take a long time to respond (such as image or video generation) via a polling mechanism: the node patiently waits for the final result instead of timing out (#37462)
Knowledge from richer spreadsheets
- Images embedded inside Excel files are now extracted during knowledge import, so spreadsheet content that relies on pictures (diagrams, screenshots, charts) is no longer lost (#37104)
Deeper observability
- Set your own trace session id for Phoenix so traces line up with your application's sessions, and follow document-retrieval steps in traces to understand how RAG results were produced (#37056, #37283)
Workflow authoring polish
- A refreshed start node makes it clearer how a workflow begins, and a smarter output node gives you more control over what a workflow returns (#37348, #35511)
- Friendlier errors when an app or workspace ID is malformed, instead of confusing failures (#37212)
Faster plugin installs in certain regions
- The plugin daemon now auto-detects your region at startup and, where network connectivity to PyPI is poor, automatically picks a nearby package mirror — so installing plugins is faster and more reliable without any manual setup. You can still pin a specific mirror if you prefer (dify-plugin-daemon#750)
Security Updates
This release fixes a path traversal issue in plugin-daemon forwarding (cve-2026-41948).
Bug Fixes
- Hardened outbound HTTP with bounded timeouts for Firecrawl, Jina, Watercrawl, Nacos, and Marketplace requests, and hardened default SSRF proxy egress (#37638, #37637, #37515, #37444, #37424, #36332)
- Fixed Lindorm vector store errors caused by the
opensearch-pyupdate (#37862) and Tongyi credential compatibility (#37942) - Invalidated credential cache after OAuth refresh (#37630)
- Improved workflow execution error handling, eagerly validated conversations to prevent hanging, and prevented legacy stop from interrupting GraphEngine runs (#37919, #37224, #37129)
- Resolved
DetachedInstanceErrorvia session management refactoring (#37847) and stabilized deployment state hydration (#37818) - Fixed conversation variable description length validation to prevent
varchar(255)truncation (#33038) and stored Chinese as unicode so search works (#37446) - Numerous web UI and accessibility/focus-ring polish fixes
Improvements
- Refactored session management across services to accept
db.sessionexplicitly via dependency injection for consistency (#37639, #37832, #37695, #37694, and related) - Modernized typing (removed redundant
type: ignore/cast, converted ABCs toProtocol, replacedisinstancechains withmatch-case) - Reduced workflow startup latency for Chatflow (#36773) and lowered workflow termination latency so stopping a run takes effect faster (#37106, #37129)
- Upgraded dependencies for CVE fixes (Bleach, PyJWT, starlette, storage group) (#37860, #37008, #37076, #37861)
Environment Variable Changes
Added
DEVICE_FLOW_APPROVE_RATE_LIMIT_PER_HOUR(docker/envs/core-services/shared.env.example)DIFY_ENV_NACOS_CONNECT_TIMEOUT,DIFY_ENV_NACOS_REQUEST_TIMEOUT(api/.env.example)ENABLE_LEARN_APP(api/.env.example)ENABLE_OAUTH_BEARER(docker/envs/core-services/shared.env.example)MILVUS_SECURE,MILVUS_SERVER_NAME,MILVUS_SERVER_PEM_PATH(docker/envs/vectorstores/milvus.env.example)NEXT_PUBLIC_ENABLE_FEATURE_PREVIEW(docker/envs/core-services/web.env.example)OPENAPI_CORS_ALLOW_ORIGINS,OPENAPI_ENABLED,OPENAPI_KNOWN_CLIENT_IDS,OPENAPI_RATE_LIMIT_PER_TOKEN(docker/envs/core-services/shared.env.example)PLUGIN_MODEL_PROVIDERS_CACHE_TTL(api/.env.example)SERVER_CONSOLE_API_URL(docker/.env.example)SSRF_PROXY_ALLOW_PRIVATE_DOMAINS,SSRF_PROXY_ALLOW_PRIVATE_IPS,SSRF_SANDBOX_PROXY_HOST,SSRF_SANDBOX_PROXY_PORT(docker/envs/middleware.env.example)PIP_MIRROR_AUTO_DETECT(plugin daemon; defaulttrue) — auto-select a nearby PyPI mirror at startup for regions with poor connectivityPIP_MIRROR_URL(plugin daemon; default empty) — manually pin the PyPI mirror; takes precedence over auto-detection
Removed
SSRF_REVERSE_PROXY_PORT,SSRF_SANDBOX_HOST(docker/envs/middleware.env.example)
Modified
UV_CACHE_DIR:/tmp/.uv-cache→/tmp/uv_cache
Docker Compose Files
docker/docker-compose.yaml(modified)docker/docker-compose.middleware.yaml(modified)docker/docker-compose.pytest.ports.yaml(added)
Database Migrations
This release includes new database migrations. Run flask db upgrade (or uv run --project api flask db upgrade) after updating the code. Notable schema additions:
- OAuth access tokens (
ENABLE_OAUTH_BEARER) - Credential visibility
- Human Input upload tables and conversation linkage
- Category-scoped plugin auto-upgrade strategy (
add_plugin_auto_upgrade_category) - App stars, learn-dify / cloud-only flags on recommended apps
- Normalized legacy end-user type
Upgrade Guide
Important
- This release includes new database migrations. Run them as part of the upgrade.
- Plugin auto-upgrade is now configured per plugin category. After running
flask db upgrade, you MUST also runflask backfill-plugin-auto-upgradeto migrate existing tenants' auto-upgrade settings into the new category-scoped model. If you skip this step, plugin auto-upgrade settings users previously configured may stop taking effect. - Environment variables changed (19 added, 2 removed, 1 modified). Review the Environment Variable Changes section and update your
.envaccordingly. - Docker Compose configuration files changed. If you maintain a customized
docker-compose.yaml, review the changes and re-apply local customizations carefully.
Docker Compose Deployments
- Back up your customized docker-compose YAML and env files.
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak cp .env .env.$(date +%s).bak 2>/dev/null || true
- Get the latest code for the
1.15.0release.git fetch --tags git checkout 1.15.0
- Stop the services (run inside the
dockerdirectory).docker compose down
- Back up data.
tar -cvf volumes-$(date +%s).tgz volumes - Review any env file changes and re-apply local customizations.
- Upgrade services.
docker compose up -d
- Backfill category-scoped plugin auto-upgrade strategies (required).
docker compose exec api flask backfill-plugin-auto-upgrade
Source Code Deployments
- Stop the API server, Worker, and Web frontend server.
- Get the latest code for the
1.15.0release.git fetch --tags git checkout 1.15.0
- Update Python dependencies.
cd api uv sync - Run database migrations.
uv run flask db upgrade
- Backfill category-scoped plugin auto-upgrade strategies (required).
uv run flask backfill-plugin-auto-upgrade
- Restart the API server, Worker, and Web frontend server.
Full Change List
- feat(dify-ui): add shared form primitives by @lyzno1 in #36334
- refactor(web): migrate annotation selection to checkbox group by @lyzno1 in #36370
- feat(dev-proxy): isolate local auth cookies by target by @lyzno1 in #36371
- chore(api): annotate simple contract responses by @hyoban in #36331
- fix(agenton): use ...
v1.14.2 - Security fixes, agent groundwork, workflow reliability, and deployment updates
🚀 What's New in v1.14.2?
v1.14.2 is a patch release focused on security hardening, workflow and knowledge reliability, observability fixes, agent groundwork, and deployment/runtime tuning after v1.14.1.
🔐 Security and administration
- Tenant-scoped sensitive endpoints — strengthened tenant isolation for app trace-config endpoints and FilePreview text extraction. Thanks @xr843 in #35793 and #35797.
- Tool credential safety — restricted default builtin tool credential updates to workspace admins and owners, and cleaned stale tenant tool credentials during
reset-encrypt-key-pair. Thanks @NeatGuyCoding and @xr843 in #36264 and #35843.
🧩 Workflow, HITL, and app runtime
- Workflow execution reliability — restored tracing after HITL workflow resume, improved workflow run callback tracking, reduced message-update database roundtrips, fixed memory fetches outside Flask context, and closed base64 file lookup sessions correctly. Thanks @Blackoutta, @CodingOnStar, @wylswz, @hjlarry, and @escape0707 in #36064, #36149, #36213, #36253, and #36308.
- Workflow and model selection polish — fixed loading behavior when no model is selected, filtered model presets by supported parameters, and improved API extension dialog controls. Thanks @iamjoel and @lyzno1 in #36342, #36339, and #36323.
📚 Data, RAG, and knowledge
- Knowledge-base stability — fixed knowledge hit-testing rendering, empty knowledge creation, recommended app category ordering, and null handling in recommended app detail retrieval. Thanks @FFXN, @laipz8200, @hjlarry, and @EvanYao826 in #36106, #36336, #36161, and #36153.
- RAG and document processing — allowed LLM nodes to access retrieved knowledge files, regenerated document summaries after API updates, fixed pipeline template rendering, and handled credential fetch failures in RAG pipelines more gracefully. Thanks @laipz8200, @EvanYao826, @FFXN, and @linw1995 in #36175, #36035, #36168, and #36165.
🎨 Web UI and product experience
- App creation and onboarding — tracked app creation source and template ID, initialized user timezone and language from the browser, and fixed WebApp icon and description display. Thanks @CodingOnStar, @lyzno1, and @JzoNgKVO in #36369, #36170, #36206, and #36209.
- Annotation and datasets UI — allowed annotation reply score thresholds below
0.8, redirected unauthorized knowledge editors back to datasets, and fixed tag rename without type payload. Thanks @JzoNgKVO, @iamjoel, and @lyzno1 in #36337, #36073, and #36182. - UI platform migration and polish — added Checkbox and CheckboxGroup primitives, migrated more controls to
@langgenius/dify-ui, improved dialog overflow layouts, and refined account avatar and install-flow interactions. Thanks @lyzno1 and @CodingOnStar in #36271, #36295, #36255, #36302, #36111, #36199, and #36210.
🔎 Observability and tracing
- Tracing reliability — isolated Langfuse v3 SDK tracer providers to prevent cross-task interference and added Phoenix parent trace fallback behavior. Thanks @GareArc and @Blackoutta in #36136 and #36290.
⚙️ Deployment, dependencies, and developer experience
- Deployment tuning — upgraded plugin-daemon to
0.6.1, increased the default GraphEngine minimum worker count, and refreshed Docker README references. Thanks @laipz8200, @kenwoodjw, and @RiskeyL in #36312, #35650, and #36303. - Backend and CI maintenance — moved static analysis toward Pyrefly, upgraded Graphon to
0.4.0, added hotfix cherry-pick provenance checks, and improved generated contract workflows. Thanks @cqjjjzr, @laipz8200, and @hyoban in #36154, #36124, #36340, and #36286. - Dependency updates — refreshed backend and agent dependencies including
authlib,ujson,langsmith, andurllib3. Thanks @dependabot[bot] in #36112, #36121, #36142, and #36160.
Upgrade Guide
Important
- This release includes a new database migration for configurable Explore app categories. Run database migrations as part of the upgrade.
- Docker Compose environment variables are now split into categorized files under
docker/envs/**. If you maintain a customizeddocker-compose.yamlor.env, review the new layout and re-apply local customizations carefully. - For self-hosted deployments, explicitly configured
SECRET_KEYvalues continue to be respected. IfSECRET_KEYis empty, Dify now generates and persists a runtime key automatically.
Docker Compose Deployments
-
Back up your customized docker-compose YAML and env files.
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak cp .env .env.$(date +%s).bak 2>/dev/null || true
-
Get the latest code from the release branch or tag.
git fetch --tags git checkout 1.14.2
-
Stop the service. Please execute in the
dockerdirectory.docker compose down
-
Back up data.
tar -cvf volumes-$(date +%s).tgz volumes -
Review the new
docker/envs/**env file layout and re-apply any local customizations. -
Upgrade services.
docker compose up -d
Source Code Deployments
-
Stop the API server, Worker, and Web frontend Server.
-
Get the latest code from the release tag.
git fetch --tags git checkout 1.14.2
-
Update Python dependencies.
cd api uv sync -
Run the migration script.
uv run flask db upgrade
-
Restart the API server, Worker, and Web frontend Server.
What's Changed
- fix: redirect unauthorized dataset access to /datasets for knowledge editors by @iamjoel in #36073
- chore: admin also has the permission of changing role by @iamjoel in #36069
- fix: fixed relative by @CodingOnStar in #36078
- chore: some match case by @asukaminato0721 in #36080
- fix: fix plugin miss version and checksum by @fatelei in #36083
- fix: restore tracing after HITL workflow resume by @Blackoutta in #36064
- chore: update deps by @hyoban in #36091
- fix: use Trans component for delete app confirmation text on editing page by @Copilot in #36092
- refactor: stabilize selector preview cards by @lyzno1 in #36105
- ci: Update pyrefly dependency version to 1.0.0 by @asukaminato0721 in #36100
- fix: knowledge hit-testing render failed. by @FFXN in #36106
- chore: remove obsolete admin console routes by @hjlarry in #35637
- fix(web): refine account avatar interactions by @lyzno1 in #36111
- chore(deps): bump ujson from 5.12.0 to 5.12.1 in /api by @dependabot[bot] in #36112
- chore(i18n): sync translations with en-US by @github-actions[bot] in #36115
- chore(deps): bump authlib from 1.6.11 to 1.6.12 in /api by @dependabot[bot] in #36121
- fix: isolate Langfuse v3 SDK TracerProvider to prevent cross-task interference by @GareArc in #36136
- chore(deps): bump langsmith from 0.7.31 to 0.8.0 in ...
v1.14.1 - Security hardening, workflow stability, and cleaner self-hosted deployments
🚀 What's New in v1.14.1?
v1.14.1 is a patch release focused on security hardening, workflow and knowledge-base stability, deployment cleanup, and continued UI platform migration after v1.14.0.
🔐 Security
- Self-hosted
SECRET_KEYhardening — Docker deployments no longer rely on a public default key. WhenSECRET_KEYis left empty, the API generates and persists a runtime key through the configured storage backend, while explicitly configured keys continue to work as before. Thanks @laipz8200 in #36049. - Internal metrics endpoint protection —
/threadsand/db-pool-statare hardened to avoid unauthenticated exposure of internal runtime and database-pool details. Thanks @orbisai0security in #35665. - Account and tool isolation — fixed an IDOR issue in
GET /account/avatarand scoped builtin-tool default-credential cleanup to the current tenant. Thanks @NeatGuyCoding and @GareArc in #35771 and #35887. - Dependency security — upgraded LiteLLM for CVE-2026-42208 and refreshed several backend dependencies, including
urllib3,gunicorn,gitpython,mako, Google SDK packages, storage libraries, and OpenTelemetry exporter packages. Thanks @crazywoola in #35953, #35779, #35791, #35863, #35864, #35958, #36011, #36012, #36013, #36017, and #36050.
🧩 Workflow, HITL, and app runtime
- Workflow stability — restored workflow-version loading through the backend API, fixed online-user polling for large app lists, prevented preview resize observer loops, and avoided schema model collisions in trial workflows. Thanks @hjlarry and @lyzno1 in #35817, #35786, #35936, and #36061.
- Workflow authoring polish — fixed variable reference picker behavior for sub-variables, workflow node title overflow, condition operator popovers, workflow checklist semantics, and KB metadata filter field selection. Thanks @iamjoel, @hjlarry, @lyzno1, and @shawny011717 in #35732, #35740, #35828, #36006, and #34149.
- Workflow execution correctness — preserved single-run input variable types, fixed
structured_output_enabledvalidation, fixed file-preview URL handling in node output display, and unblocked plugin model selector tools on v1.14.0 workflows. Thanks @Jingyi-Dify, @fatelei, @shawny011717, and @sawyer-shi in #35710, #35747, #34150, and #35794. - Human input — exposed selected action values for Human-in-the-loop flows. Thanks @Blackoutta in #35451.
- Question Classifier — added editable class labels. Thanks @Blackoutta in #35430.
📚 Data, RAG, and knowledge
- Knowledge-base image rendering — fixed image rendering failures in the knowledge base. Thanks @FFXN in #35914.
- Document indexing — skip empty documents before vector embedding and validate missing text indexing techniques. Thanks @princepal9120 and @juyua9 in #35763 and #35941.
- RAG deduplication — use
doc_idas the deduplication key across providers, not only Dify-hosted providers. Thanks @ki3nd in #35759. - Dataset metadata filters — preserve dataset metadata filters in API paths and fix KB metadata filter field selection. Thanks @princepal9120 and @shawny011717 in #35700 and #34149.
- Upload filename handling — clean upload filenames parsed from URLs and avoid doubled dots when standardizing datasource file extensions. Thanks @jonathanchang31 and @Beandon13 in #35706 and #35808.
🎨 Web UI and design system
- Dify UI migration — continued migration from legacy overlays, tooltips, drawers, selects, tags, and searchable pickers to
@langgenius/dify-uiprimitives, including new Drawer, Tabs, ToggleGroup, Autocomplete, and Combobox support. Thanks @lyzno1 and @CodingOnStar in #35675, #35715, #35720, #35721, #35774, #35785, #35787, #35792, #35825, #35868, #35881, #35892, #35896, #35917, #35961, #35962, #35963, #35965, #35976, #35982, and #36066. - Accessibility and semantics — improved web accessibility, removed unnecessary
data-testidusage, normalized select value handling, improved help glyph semantics, and refined premium badge button semantics. Thanks @lyzno1 in #35999, #36007, #36008, and #36026. - Overlay and navigation reliability — restored app navigation create submenu interaction, fixed transfer workspace dropdown display, normalized overlay control, aligned Tailwind v4 CSS migration, forwarded CSP nonce to the theme script, and aligned tag filter dropdown icons. Thanks @hjlarry, @iamjoel, and @lyzno1 in #35681, #35876, #35832, #35829, #35960, and #36041.
- Publisher and launch flows — improved publisher confirmation dialog handling and fixed mismatched copy in prefilled WebApp launch descriptions. Thanks @CodingOnStar and @iamjoel in #35701 and #35964.
- Audio and transcript behavior — explicitly resume
AudioContextand play audio on first TTS load, and passend_user.external_user_idcorrectly to transcript ASR. Thanks @ki3nd in #35901 and #35898.
🔎 Observability and tracing
- Phoenix tracing — improved Phoenix workflow tracing. Thanks @Blackoutta in #35605.
- LangSmith tracing — fixed
trace_idmismatch in chatflow workflow traces. Thanks @ki3nd in #35979.
⚙️ Deployment and operations
- Docker env layout — split Docker Compose environment variables into organized
docker/envs/**files and updated generation, cleanup, and middleware setup flows. Thanks @macatizm and @laipz8200 in #31586 and #35938. - Middleware setup — updated local setup and cleanup flows for the new middleware env template location. Thanks @laipz8200 in #35946.
- Database pool behavior — added
SQLALCHEMY_POOL_RESET_ON_RETURNconfiguration support. Thanks @fatelei in #31156. - WebSocket service — separated the WebSocket service for cleaner deployment boundaries. Thanks @hjlarry in #35981.
- Explore categories — Explore recommended apps now support multiple configurable categories and adjustable category order. Thanks @hjlarry in #35723.
- TiDB endpoint updates — fixed endpoint updates when TiDB status c...
v1.14.0
🚀 What's New in v1.14.0?
Collaboration
Collaboration allows workspace members to edit the same workflow together, with synced graph updates, online presence, and shared visibility into who is working where.
On self-hosted deployments, collaboration is turned off by default. Enable it by setting:
ENABLE_COLLABORATION_MODE = true
SERVER_WORKER_CLASS = geventwebsocket.gunicorn.workers.GeventWebSocketWorker
NEXT_PUBLIC_SOCKET_URL = your deployment’s WebSocket URL (e.g., wss://dify.example.com)
For more details, see Full Documentation
Human-in-the-loop (HITL)
- Service API for HITL — programmatic support for human-in-the-loop flows alongside existing console behavior.
MCP and plugins
- MCP tool metadata — refresh after updates so the UI stays in sync.
- MCP server URL — fix double
/v1that could break OAuth and authorization (404). - MCP OAuth discovery — handle malformed JSON safely.
- MCP schema publishing — map
checkboxandjson_objecttypes correctly. - Plugins — auto-upgrade strategy persistence, local installer and file-input behavior, tenant scoping for inner API end-user lookup.
Marketplace and OAuth
- Marketplace and OAuth — targeted fixes for marketplace flows and OAuth sign-in (including edge cases such as null email on GitHub OAuth).
UI kit and front-end platform
@langgenius/dify-ui— shared primitives (for example PreviewCard, Meter), design tokens, and broad migration from ad-hocweb/base/uitoward the package.- Accessibility — date and time pickers, auto-update strategy picker, scrollbars in plugin and model selectors, and related polish.
- Goto Anything — recent items,
/gocommand, deeper app sub-sections; fix for Cmd+K (removed problematic dynamic import). - Prompt editor — slash-triggered variable filtering; keyboard up/down in variable lists.
- Follow-up questions — improved settings and token limits for suggested questions.
- Modals — ApiKey, provider config, and others refactored toward a shared Dialog pattern with tests.
Observability and analytics
- Langfuse — optional time-to-first-token (TTFT) reporting.
- Explore — banner impression tracking; app preview event tracking on cards.
Billing and quotas
- Quota v3 integration in the product stack.
- Billing UI — Meter-based usage presentation; more resilient cleanup when billing APIs fail.
- File uploader — billing-aware behavior and copy updates.
Data, RAG, and knowledge
- Summary index and Weaviate — compatibility fixes when using the summary index with Weaviate.
- Vector projection — include
is_summaryandoriginal_chunk_idin default projection where relevant. - External and bound datasets — stronger tenant checks on knowledge APIs.
Infrastructure and operations
- Docker Compose — healthchecks for
api,worker, andworker_beat; template and env example updates (for example S3 address style). - Celery — default worker concurrency raised to 4; missing queue fix.
- PostgreSQL — higher default max connections (200) for the updated app DB path.
- Redis — configurable key prefix; retry logic for Redis operations.
- TiDB — endpoint support and related auth binding migration (Qdrant endpoint on TiDB auth bindings).
- Markdown — optional
ALLOW_INLINE_STYLESenvironment variable to allow inline CSS in rendered Markdown when needed.
Security
- Change-email flow — stricter phase-bound token handling (GHSA-4q3w-q5mc-45rq).
- IDOR hardening — tenant validation on data-source binding; dataset and API ownership checks where gaps were found.
Performance
- Optimized performance of graph initialization.
API and platform internals
- Graphon — upgrade to standalone Graphon 0.2.2 (replacing in-tree
dify_graphnaming and packaging). - OpenAPI — script to generate OpenAPI v2 JSON and documentation pointer.
- Deprecation — some legacy console APIs marked deprecated in favor of newer patterns.
- Large SQLAlchemy 2.0
select()migration, PydanticBaseModelfor many console and service responses, and testcontainers-based tests for stability.
What's Changed
- test: migrate restore archived workflow run tests to testcontainers by @YB0y in #34083
- refactor(api): continue decoupling dify_graph from API concerns by @laipz8200 in #33580
- refactor: replace dict with BedrockRetrievalSetting BaseModel in knowledge_service by @faizkhairi in #34080
- test: migrate workflow converter tests to testcontainers by @Desel72 in #34038
- refactor(api): rename dify_graph to graphon by @WH-2099 in #34095
- refactor: select in service API wraps, file_preview, and site controllers by @RenzoMXD in #34086
- test: migrate database retrieval tests to testcontainers by @YB0y in #34087
- test: migrate account deletion sync tests to testcontainers by @YB0y in #34091
- test: migrate metadata partial update tests to testcontainers by @YB0y in #34088
- test: migrate plugin parameter service tests to testcontainers by @YB0y in #34090
- test: Unit test case for services.dataset_services.py by @rajatagarwal-oss in #33212
- fix: handle null email in GitHub OAuth sign-in by @Krishnachaitanyakc in #34043
- fix: datasource api-key modal z-index incorrect by @hjlarry in #34103
- fix(prompt-editor): fix unexpected blur effect in prompt editor by @WTW0313 in #34069
- refactor: select in service API dataset document and segment controllers by @RenzoMXD in #34101
- chore(deps): bump pypdf from 6.9.1 to 6.9.2 in /api by @dependabot[bot] in #34099
- refactor: use ungh for github api by @hyoban in #34108
- fix: dataset query created_by empty UUID in iteration subgraph (#34004) by @Achieve3318 in #34044
- chore: enable no-barrel-files by @hyoban in #34121
- chore(deps): update picomatch version in nodejs-client and web packages by @WTW0313 in #34123
- fix: the menu of multi nodes always display on left top corner by @hjlarry in #34120
- refactor(web): convert 7 enums to as-const objects (batch 5) by @mahmoodhamdi in #33960
- fix: import path by @QuantumGhost in #34124
- chore: Support merge queue status checks in required CI workflows by @laipz8200 in #34133
- chore(api): remove backend utcnow usage by @laipz8200 in #34131
- chore: Keep main CI lane checks stable when skipped by @laipz8200 in #34143
- chore: remove stale mypy suppressions and align dataset service tests by @WH-2099 in #34130
- test: migrate human input delivery test service tests to testcontainers by @YB0y in #34092
- chore(deps-dev): bump nltk from 3.9.3 to 3.9.4 in /api by @dependabot[bot] in #34117
- test: migrate api key auth service tests to testcontainers by @YB0y in #34147
- refactor: use EnumText for model_type and WorkflowNodeExecution.status by @tmimmanuel in #34093
- test: migrate plugin service tests to testcontainers by @YB0y in #34098
- chore(deps): bump requests from 2.32.5 to 2.33.0 in /api by @dependabot[bot] in #34116
- test: migrate api token service tests to testcontainers by @YB0y in #34148
- chore(deps): bump brace-expansion from 5.0.4 to 5.0.5 in /sdks/nodejs-client by @dependabot[bot] in #34159
- test: migrate auth integration tests to testcontainers by @YB0y in #34089
- feat: add copy/delete to multi nodes context menu by @hjlarry in #34138
- test: use happy dom by @hyoban in #34154
- chore(ci): remove Python 3.11 from CI test workflows by @1Ckpwee in #34164
- ci: skip duplicate actions by @hyoban in #34168
- feat: return correct dify-plugin-daemon error message by @fatelei in #34171
- feat: enterprise otel exporter by @GareArc in #33138
- refactor: use EnumText for credential_type in TriggerSubscription by @tmimmanuel in #34174
- refactor: select in core/ops trace manager and trace providers by @RenzoMXD in https://github.com/langgenius/...
v1.13.3
🚀 What's New in v1.13.3?
Our latest patch release, v1.13.3, focuses on stability and correctness across workflow execution, streaming, and knowledge retrieval. Here's a quick look at the most important updates:
🎬 New Features
- Workflow Configuration: Added variable-reference support for model parameters in LLM, Question Classifier, and Variable Extractor nodes by @scdeng in #33082.
🛠️ Bug Fixes
- Streaming Reliability: Fixed
StreamsBroadcastChannelreplay and concurrency issues to keep frontend/backend event delivery stable by @QuantumGhost in #34030 and #34061. - Workflow Editor Behavior: Fixed pasted nodes retaining Loop/Iteration metadata and prevented
HumanInputnodes from being pasted into invalid containers by @majiayu000 and @hjlarry in #29983 and #34077. - Runtime Execution: Restored prompt message transformation logic and corrected
max_retries=0handling for executor-driven HTTP Request execution by @QuantumGhost, @fatelei, and @kurokobo in #33666, #33619, and #33688. - Knowledge Retrieval: Preserved citation metadata in web responses, fixed crashes when dataset icon metadata is missing, corrected hit-count query filtering, and restored indexed document chunk previews by @Theysua, @copilot-swe-agent, and @fatelei in #33778, #33907, #33757, and #33942.
🔧 Under the Hood
- Patch Stability: This release prioritizes targeted fixes for workflow runtime behavior, real-time streaming, and knowledge base usability for teams upgrading from v1.13.2.
Upgrade Guide
Important
The Sandbox image used by Dify v1.13.3 expects the following Python and Node.js paths.
If you upgraded from an older Docker Compose deployment and already have docker/volumes/sandbox/conf/config.yaml, update it on the host machine:
python_path: /opt/python/bin/python3
nodejs_path: /usr/local/bin/nodeDo not edit the file inside the sandbox container. The directory docker/volumes/sandbox/conf is mounted into the container as /conf, so host changes persist after container restarts.
Docker Compose Deployments
-
Back up your customized docker-compose YAML file (optional)
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
-
Get the latest code from the main branch
git checkout main git pull origin main
-
Stop the service. Please execute in the docker directory
docker compose down
-
Back up data
tar -cvf volumes-$(date +%s).tgz volumes -
Upgrade services
docker compose up -d
Source Code Deployments
-
Stop the API server, Worker, and Web frontend Server.
-
Get the latest code from the release branch:
git checkout 1.13.3
-
Update Python dependencies:
cd api uv sync -
Then, let's run the migration script:
uv run flask db upgrade
-
Finally, run the API server, Worker, and Web frontend Server again.
What's Changed
- refactor(web): number inputs to use Base UI NumberField by @lyzno1 in #33539
- feat(web): add base ui toast by @lyzno1 in #33569
- chore(i18n): sync translations with en-US by @github-actions[bot] in #33585
- chore(i18n): sync translations with en-US by @github-actions[bot] in #33586
- refactor(api): Query API to select function_1 by @RenzoMXD in #33565
- refactor: replace sa.String with EnumText for mapped_columns by @tmimmanuel in #33547
- refactor(api): replace dict/Mapping with TypedDict in core/app by @statxc in #33601
- chore(deps): bump pyasn1 from 0.6.2 to 0.6.3 in /api by @dependabot[bot] in #33611
- refactor(api): replace dict/Mapping with TypedDict in core/tools by @bittoby in #33610
- refactor: use EnumText for dataset and replace string literals 4 by @tmimmanuel in #33606
- chore(deps): bump next packages to 16.1.7 by @lyzno1 in #33616
- fix: tighten toast typing and restore focus visibility by @lyzno1 in #33591
- chore: update deps by @hyoban in #33618
- fix(toast): refine stacked hover and focus styles by @lyzno1 in #33620
- fix: fix max_retries is hardcode by @fatelei in #33619
- feat: enhance model plugin workflow checks and model provider management UX by @lyzno1 in #33289
- refactor: route low-cost next modules through compat re-exports by @lyzno1 in #33622
- refactor(api): replace dict/Mapping with TypedDict in core/rag retrieval_service.py by @bittoby in #33615
- refactor(web): move component tests into sibling tests directories by @CodingOnStar in #33623
- refactor: route next/link through compat re-export by @lyzno1 in #33632
- refactor(api): replace dict with SummaryIndexSettingDict TypedDict in core/rag by @bittoby in #33633
- refactor: use EnumText in provider models by @tmimmanuel in #33634
- refactor: route next/navigation through compat re-export by @lyzno1 in #33636
- fix: add responding error information when obtain pipeline template detail failed by @FFXN in #33628
- fix: clarify webhook debug endpoint behavior by @laipz8200 in #33597
- chore: compatiable end-user and end_user by @fatelei in #33638
- test(workflow): reorganize specs into tests and align with shared test infrastructure by @CodingOnStar in #33625
- refactor(web): migrate core toast call sites to base ui toast by @lyzno1 in #33643
- feat: remove weaviate client del method by @fatelei in #33593
- fix: sync workflow description and name to MCP server on update by @Desel72 in #33637
- fix(api): Preserving the content transform logic in fetch_prompt_messages by @QuantumGhost in #33666
- refactor(api): type default_retrieval_model with DefaultRetrievalModelDict in core/rag by @bittoby in #33676
- chore: bump version to 1.13.2 by @QuantumGhost in #33681
- refactor: move to std-semver by @hyoban in #33682
- ci: revert agent reporter by @hyoban in #33685
- fix: leaked set timeout by @hyoban in #33692
- refactor: EnumText for preferred_provider_type MessageChain, Banner by @tmimmanuel in #33696
- chore(deps): bump ujson from 5.9.0 to 5.12.0 in /api by @dependabot[bot] in #33683
- refactor(api): type Firecrawl API responses with TypedDict by @bittoby in #33691
- chore(deps): bump pypdf from 6.8.0 to 6.9.1 in /api by @dependabot[bot] in #33698
- refactor(api): type WaterCrawl API responses with TypedDict by @bittoby in #33700
- chore: update deps by @hyoban in #33706
- feat(web): add base ui scroll area primitive by @lyzno1 in #33727
- ci: use codecov by @hyoban in #33723
- fix: compatible with emoji/object icons in plugin card icon resolver by @IthacaDream in #33732
- refactor: use EnumText(StorageType) for UploadFile.storage_type by @tmimmanuel in #33728
- feat(confirm): input app name for app deletion confirmation by @bowenliang123 in #33660
- refactor(web): sidebar app list to scroll area component by @lyzno1 in #33733
- refactor: migrate db.session.query to select in infra layer by @RenzoMXD in #33694
- fix: pass default root to OpenDAL Operator for fs scheme by @RickDamon in #33678
- refactor(web): migrate auth toast calls to ui toast by @lyzno1 in #33744
- chore: add pytest XML and branch coverage reports by @laipz8200 in #33730
- style(scroll-bar): align design by @lyzno1 in #33751
- fix(api): add
trigger_infoto WorkflowNodeExecutionMetadataKey by @QuantumGhost in #33753 - fix: use RetrievalModel type for retrieval_model field in HitTestingPayload by @lyfuci in #33750
- fix: preserve timing metrics in parallel iteration by @BeautyyuYanli in #33216
- test(workflow): add unit tests for workflow components by @CodingOnStar in #33741
- fix: Add dataset_id filters to the hit_...
v1.13.2
This patch release fixes several critical regressions and stability issues introduced in v1.13.1, including:
- a severe regression in prompt message transformation that caused multiple LLM-plugin invocation failures across
LLM-related nodes, including LLM and Question Classifier. - Knowledge Retrieval node execution failures caused by incompatible enum values
- improper Weaviate client cleanup
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
Docker Compose Deployments
-
Back up your customized docker-compose YAML file (optional)
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
-
Get the latest code from the main branch
git checkout main git pull origin main
-
Stop the service. Please execute in the docker directory
docker compose down
-
Back up data
tar -cvf volumes-$(date +%s).tgz volumes -
Upgrade services
docker compose up -d
Note
If you encounter errors like below
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 #28706
docker compose --profile postgresql up -dSource Code Deployments
-
Stop the API server, Worker, and Web frontend Server.
-
Get the latest code from the release branch:
git checkout 1.13.2
-
Update Python dependencies:
cd api uv sync -
Then, let's run the migration script:
uv run flask db upgrade
-
Finally, run the API server, Worker, and Web frontend Server again.
What's Changed
- chore: bump version to 1.13.2 (#33681) by @QuantumGhost
- fix: fix max_retries is hardcode (#33619) by #32715 @fatelei
- fix(api): Preserving the content transform logic in fetch_prompt_messages (#33666) by @QuantumGhost
- feat: remove weaviate client del method (#33593) by @fatelei
- fix(api): make CreatorUserRole accept both
end-userandend_user(#33638) by @fatelei
Full Changelog: 1.13.1...1.13.2
v1.13.1
🚀 Major Functional Changes
Data platform and dataset operations
- Added Hologres as a supported backend option for both vector retrieval and full-text search.
- Added Service API endpoints for dataset document downloads:
- Batch ZIP download for selected documents.
- Signed URL download for single-document original files.
Workflow and chat experience improvements
- Breaking change: HITL email content now uses markdown rendering before delivery.
Existing email templates that relied on raw/plain behavior may render differently after upgrade. - Draft variables are now user-scoped instead of app-scoped. Historical draft variables will not be available after upgrading.
- Added edge context menu support in workflow canvas, including direct edge deletion.
- Preserved existing connections when changing node types in workflow editing.
- Added configurable send-key behavior (
EntervsShift+Enter) for embedded chat input. - Added file payloads in message-end stream responses.
- Removed GPT-4-specific hardcoded behavior from default model selection logic.
- Added a new
export-app-messagesCLI command to export application messages and related feedback toJSONL.GZ(local or cloud storage).
🔐 Security Updates
- Prevented SQL injection risks in vector-store query paths by switching to parameterized SQL in affected implementations.
- Hardened HITL email delivery:
- Sanitize subject and body content.
- Strip CR/LF from subjects to prevent SMTP header-injection vectors.
- Enforced ownership checks for conversation deletion APIs.
- Cleared stale provider credentials during plugin uninstall to reduce residual credential risk.
- Improved enterprise API error handling and license-enforcement behavior for invalid/expired license states.
🏗️ Configuration, Architecture, and Deployment Updates
Deployment and operations
- Added a dedicated Celery queue:
dataset_summaryfor LLM-heavy summary generation tasks.- Ensure workers subscribe to this queue to avoid summary-job backlog.
- Added telemetry metrics for retention cleanup tasks (messages/workflow runs), plus flush behavior for short-lived command jobs.
Configuration changes
- Added
REDIS_MAX_CONNECTIONS. - Deprecated
PUBSUB_*event-bus settings in favor ofEVENT_BUS_*settings.
🛠 Other Noteworthy Changes
- Fixed
workflow_runs.started_atbeing overwritten on resume. - Fixed metadata batch-edit silent failures caused by split-transaction edge cases.
- Fixed metadata filter extraction issues in knowledge retrieval (
{{...}}conditions). - Restored citation visibility in advanced chat applications.
- Fixed conversation variable reset behavior after HITL nodes.
- Fixed a page crash in knowledge-retrieval node configuration flow.
- Fixed chat assistant blocking response-mode behavior.
- Added
doc_typehandling in Weaviate vector attributes for better compatibility. - Upgraded OpenTelemetry dependencies to resolve context-detach errors.
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
Docker Compose Deployments
-
Back up your customized docker-compose YAML file (optional)
cd docker cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
-
Get the latest code from the main branch
git checkout main git pull origin main
-
Stop the service. Please execute in the docker directory
docker compose down
-
Back up data
tar -cvf volumes-$(date +%s).tgz volumes -
Upgrade services
docker compose up -d
Note
If you encounter errors like below
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 #28706
docker compose --profile postgresql up -dSource Code Deployments
-
Stop the API server, Worker, and Web frontend Server.
-
Get the latest code from the release branch:
git checkout 1.13.1
-
Update Python dependencies:
cd api uv sync -
Then, let's run the migration script:
uv run flask db upgrade
-
Finally, run the API server, Worker, and Web frontend Server again.
What's Changed
- feat(api): add scheduled cleanup task for specific workflow logs by @razerzhang in #31843
- test: add unit tests for some base components by @saumyatalwani in #32201
- test: add comprehensive unit and integration tests for dataset module by @CodingOnStar in #32187
- test(web): add comprehensive unit and integration tests for plugins and tools modules by @CodingOnStar in #32220
- test: add comprehensive unit and integration tests for billing components by @CodingOnStar in #32227
- test: add unit and integration tests for share, develop, and goto-anything modules by @CodingOnStar in #32246
- test: add comprehensive unit and integration tests for RAG Pipeline components by @CodingOnStar in #32237
- feat(tests): add integration tests for explore app list, installed apps, and sidebar lifecycle flows by @CodingOnStar in #32248
- fix: metadata batch edit silently fails due to split transactions and swallowed exceptions by @veeceey in #32041
- fix: can not upload file in single run by @hyoban in #32276
- chore(deps): bump pillow from 12.0.0 to 12.1.1 in /api by @dependabot[bot] in #32250
- feat: support config max size of plugin generated files by @bowenliang123 in #30887
- feat(api): optimize OceanBase vector store performance and configurability by @connermo in #32263
- test(web): add and enhance frontend automated tests across multiple modules by @CodingOnStar in #32268
- chore(deps): bump qs from 6.14.1 to 6.14.2 in /web by @dependabot[bot] in #32290
- test: add unit tests for base components-part-1 by @poojanInfocusp in #32154
- test: add integration tests for app card operations, list browsing, and create app flows by @CodingOnStar in #32298
- test: add tests for some base components by @saumyatalwani in #32265
- refactor(web): extract custom hooks from complex components and add comprehensive tests by @CodingOnStar in #32301
- chore(deps): bump sqlparse from 0.5.3 to 0.5.4 in /api by @dependabot[bot] in #32315
- test: add unit tests for base chat components by @poojanInfocusp in #32249
- fix(app-copy): inherit web app permission from original app by @GareArc in #32323
- fix(api): make DB migration Redis lock TTL configurable and prevent LockNotOwnedError from masking failures by @lin-snow in #32299
- fix: remove explore context and migrate query to orpc contract by @lyzno1 in #32320
- refactor(web): centralize role-based route guards and fix anti-patterns by @lyzno1 in #32302
- ci: update dependabot config by @asukaminato0721 in #32346
- chore(deps-dev): bump types-greenlet from 3.1.0.20250401 to 3.3.0.20251206 in /api by @dependabot[bot] in #32349
- fix(i18n): fix critical errors and overhaul Persian (fa-IR) translations in workflow.json by @Haohao-end in #32342
- refactor(workflow-file): move
core.filetocore.workflow.fileby @WH-2099 in #32252 - refactor(document_extractor): Extract configs by @laipz8200 in #31828
- refactor(web): replace String.match() with RegExp.exec() for non-global regex by @apoorvdarshan in #32386
- ci: Add weekly schedule for pip and uv ecosystems by @asukaminato0721 in #32398
- chore(d...