Original release notes
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 i (U+00EF), (U+00BF), 34 (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_TOKENis 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: ``bash python -c 'import secrets; print(secrets.token_urlsafe(32))' Set the same value asAGENT_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 -d
The database migrations will run automatically on startup.
[!IMPORTANT] Review the new
DIFY_AGENT_API_TOKENvariable in.env. The default value is insecure - generate a secure token for production: ```bash python -c 'import secrets; print(secrets.token_urlsafe(32))'
Source Code
git pull origin main
cd api
flask db upgrade
---
What's Changed
- refactor(web): use generated dataset card queries by @lyzno1 in https://github.com/langgenius/dify/pull/39203
- refactor(web): use generated OAuth query options by @lyzno1 in https://github.com/langgenius/dify/pull/39204
- refactor(web): align integrations sidebar components by @lyzno1 in https://github.com/langgenius/dify/pull/39202
- feat(workflow): improve block selector navigation and previews by @lyzno1 in https://github.com/langgenius/dify/pull/39212
- fix(dataset_service): use flush() instead of commit() to preserve caller transaction by @sergioperezcheco in https://github.com/langgenius/dify/pull/39223
- ci: route default Depot jobs to 4-core runners by @lyzno1 in https://github.com/langgenius/dify/pull/39277
- chore: the node should not draggable when preview a workflow by @hjlarry in https://github.com/langgenius/dify/pull/39131
- test(web): align test state boundaries by @lyzno1 in https://github.com/langgenius/dify/pull/39239
- refactor(web): avoid setState in website crawler effects by @wanxiankai in https://github.com/langgenius/dify/pull/39237
- fix: text generation web app keeps loading after timeout by @iamjoel in https://github.com/langgenius/dify/pull/39268
- refactor(web): avoid direct setState in effect in jina reader crawler (#25194) by @pepepeboom in https://github.com/langgenius/dify/pull/39216
- fix(web): restore permission selector semantics by @lyzno1 in https://github.com/langgenius/dify/pull/39269
- chore: bump the github-actions-dependencies group with 5 updates by @dependabot[bot] in https://github.com/langgenius/dify/pull/39247
- fix: can't create chat app when get tenant default model schema error by @hjlarry in https://github.com/langgenius/dify/pull/39266
- fix: prevent hidden-tab collaboration leader from saving stale drafts by @Kevin9703 in https://github.com/langgenius/dify/pull/38997
- fix(api, web): scope trial app file uploads to the app tenant by @linw1995 in https://github.com/langgenius/dify/pull/39149
- refactor: use catalog for workflow archive maintenance by @zhaohao1004 in https://github.com/langgenius/dify/pull/39001
- fix(agent): preserve complete model usage pricing by @zyssyz123 in https://github.com/langgenius/dify/pull/39201
- feat(web): add webapp access control to agent access point by @GareArc in https://github.com/langgenius/dify/pull/39285
- fix: the input of agent chat would be replaced if conversation history updated by @iamjoel in https://github.com/langgenius/dify/pull/39289
- feat(dataset): proxy KnowledgeFS Console requests by @hyoban in https://github.com/langgenius/dify/pull/39158
- docs: refine frontend testing guidance by @lyzno1 in https://github.com/langgenius/dify/pull/39290
- chore(deps): update pnpm and workspace dependencies by @lyzno1 in https://github.com/langgenius/dify/pull/39292
- fix: show persistent error when workflow draft save fails by @iamjoel in https://github.com/langgenius/dify/pull/39293
- feat(web): add step-by-step tour shell by @Jingyi-Dify in https://github.com/langgenius/dify/pull/38785
- chore: display non-LLM settings in integration tool details by @iamjoel in https://github.com/langgenius/dify/pull/39295
- chore(i18n): sync translations with en-US by @github-actions[bot] in https://github.com/langgenius/dify/pull/39296
- revert(ci): restore default Depot runners by @lyzno1 in https://github.com/langgenius/dify/pull/39297
- test: use SQLite sessions in unit misc by @asukaminato0721 in https://github.com/langgenius/dify/pull/39123
- test: use SQLite sessions in unit misc by @asukaminato0721 in https://github.com/langgenius/dify/pull/39121
- test: use SQLite sessions in unit misc by @asukaminato0721 in https://github.com/langgenius/dify/pull/39122
- feat: support export agent dsl in sidebar by @iamjoel in https://github.com/langgenius/dify/pull/39299
- fix(web): stop doubling basePath in auth refresh redirects by @sergioperezcheco in https://github.com/langgenius/dify/pull/39273
- chore: when dataset permission is not all team, update rbac config to... by @fatelei in https://github.com/langgenius/dify/pull/39227
- refactor(web): remove basePath from hydration boundary by @lyzno1 in https://github.com/langgenius/dify/pull/39308
- ci: simplify test workflow execution by @WH-2099 in https://github.com/langgenius/dify/pull/39318
- test: use SQLite sessions in unit misc by @asukaminato0721 in https://github.com/langgenius/dify/pull/39120
- fix(api): use resource tenant for draft variable files by @linw1995 in https://github.com/langgenius/dify/pull/39307
- fix(configs): reject host:port-shaped PLUGIN_REMOTE_INSTALL_PORT with actionable hint by @sergioperezcheco in https://github.com/langgenius/dify/pull/39329
- fix: return 400 instead of 500 when file field is missing in audio-to-text endpoints (#39303) by @rkfshakti in https://github.com/langgenius/dify/pull/39322
- test: use SQLite sessions in unit misc by @asukaminato0721 in https://github.com/langgenius/dify/pull/39119

