Releases: langgenius/dify
v1.9.1 – 1,000 Contributors, Infinite Gratitude
Congratulations on having our 1000th contributor!

🚀 New Features
-
Infrastructure & DevOps:
- Next.js upgraded to 15.5, now leveraging Turbopack in development for a faster, more modern build pipeline by @17hz in #24346.
- Provided
X-Dify-Version
headers in marketplace API access for better traceability by @RockChinQ in #26210. - Security reporting improvements, with new sec report workflow added by @crazywoola in #26313.
-
Pipelines & Engines:
- Built-in pipeline templates now support language configuration, unlocking multilingual deployments by @WTW0313 in #26124.
- Graph engine now blocks response nodes during streaming to avoid unintended outputs by @laipz8200 in #26364 / #26377.
-
Community & Documentation:
- Streamlined
AGENTS.md
contribution guidelines by @laipz8200 in #26308. - Updated Graph Engine README docs for clarity by @hjlarry in #26337.
- Streamlined
🛠 Fixes & Improvements
-
Debugging & Logging:
- Fixed NodeRunRetryEvent debug logging not working properly in Graph Engine by @quicksandznzn in #26085.
- Fixed LLM node losing Flask context during parallel iterations, ensuring stable concurrent runs by @quicksandznzn in #26098.
- Fixed agent-strategy prompt generator error by @quicksandznzn in #26278.
-
Search & Parsing:
- Fixed
full_text_search
name reliability by @JohnJyong in #26104. - Corrected value extraction handling in IME composition for search input fields by @yangzheli in #26147.
- OceanBase parser selection explanation clarified by @longbingljw in #26071.
- Fixed
-
Pipeline & Workflow:
- Fixed workflow variable splitting logic (requires ≥2 parts) by @zhanluxianshen in #26355.
- Fixed tool node attribute
tool_node_version
judgment error causing compatibility issues by @goofy-z in #26274. - Fixed iteration conversation variables not syncing correctly by @laipz8200 in #26368.
- Fixed Knowledge Base node crash when
retrieval_model
is null by @quicksandznzn in #26397. - Fixed workflow node mutation issues, preventing props from being incorrectly altered by @hyongtao-code in #26266.
- Removed restrictions on adding workflow nodes by @zxhlyh in #26218.
-
File Handling:
- Fixed remote filename handling so
Content-Disposition: inline
becomesinline
instead of incorrect parsing by @sorphwer in #25877. - Synced FileUploader context with props to fix inconsistent file parameters in cached variable view by @Woo0ood in #26199.
- Fixed variable not found error (#26144) by @sqewad in #26155.
- Fixed db connection error in
embed_documents()
by @AkisAya in #26196. - Fixed model list refresh when credentials change by @zxhlyh in #26421.
- Fixed retrieval configuration handling and missing
vector_setting
in dataset components by @WTW0313 in #26361 / #26380. - Fixed ChatClient
audio_to_text
files
keyword bug by @EchterTimo in #26317. - Added missing import
IO
in client.py by @EchterTimo in #26389. - Removed
FILES_URL
in default .yaml settings by @JoJohanse in #26410.
- Fixed remote filename handling so
-
Performance & Networking:
- Improved pooling of
httpx
clients for requests to code sandbox and SSRF protection by @Blackoutta in #26052. - Distributed plugin auto-upgrade tasks with concurrency control by @RockChinQ in #26282.
- Switched plugin auto-upgrade cache to Redis for reliability by @RockChinQ in #26356.
- Fixed plugin detail panel not showing when >100 plugins are installed by @JzoNgKVO in #26405.
- Debounce reference fix for performance stability by @crazywoola in #26433.
- Improved pooling of
-
UI/UX & Display:
- Fixed lingering display-related issues (translations, UI consistency) by @hjlarry in #26335.
- Fixed broken CSS animations under Turbopack by naming unnamed animations in CSS modules by @lyzno1 in #26408.
- Fixed verification code input using wrong
maxLength
prop by @hyongtao-code in #26244. - Fixed array-only filtering in List Operator picker, removed file-children fallback, aligned child types by @Woo0ood in #26240.
- Fixed translation inconsistencies in ja-JP: “ナレッジベース” vs. “ナレッジの名前とアイコン” by @mshr-h in #26243 and @NeatGuyCoding in #26270.
- Improved “time from now” i18n support by @hjlarry in #26328.
- Standardized dataset-pipeline i18n terminology by @lyzno1 in #26353.
-
Code & Components:
- Refactored component exports for consistency by @ZeroZ-lab in #26033.
- Refactored router to apply
ns.route
style by @laipz8200 in #26339. - Refactored lint scripts to remove duplication and simplify naming by @lyzno1 in #26259.
- Applied
@console_ns.route
decorators to RAG pipeline controllers (internal refactor) by @Copilot in #26348. - Added missing
type="button"
attributes in components by @Copilot in #26249.
Upgrade Guide
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.9.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
- fix(api): graph engine debug logging NodeRunRetryEvent not effective by @quicksandznzn in #26085
- fix full_text_search name by @JohnJyong in #26104
- bump nextjs to 15.5 and turbopack for development mode by @17hz in #24346
- chore: refactor component exports for consistency by @ZeroZ-lab in #26033
- fix:add some explanation for oceanbase parser selection by @longbingljw in #26071
- feat(pipeline): add language support to built-in pipeline templates and update related components by @WTW0313 in #26124
- ci: Add hotfix/** branches to build-push workflow triggers by @QuantumGhost in #26129
- fix(api): Fix variable truncation for
list[File]
value in output mapping by @QuantumGhost in #26133 - one example of Session by @asukaminato0721 in #24135
- fix(api):LLM node losing Flask context during parallel iterations by @quicksandznzn in #26098
- fix(search-input): ensure proper value extraction in composition end handler by @yangzheli in #26147
- delete end_user check by @JohnJyong in #26187
- improve: pooling httpx clients for requests to code sandbox and ssrf by @Blackoutta in #26052
- fix: remote filename will be 'inline' if Content-Disposition: inline by @sorphwer in #25877
- perf: provide X-Dify-Version for marketplace api access by @RockChinQ in #26210
- Chore/remove add node restrict of workflow by @zxhlyh in #26218
- Fix array-only filtering in List Operator picker; remove file children fallback and align child types. by @Woo0ood in #26240
- fix: sync FileUploader context with props to fix inconsistent file parameter state in “View cached variables”. by @Woo0ood in #26199
- fix: add echarts and zrender to transpilePackages for ESM compatibility by @lyzno1 in #26208
- chore: fix inaccurate translation in ja-JP by @mshr-h in #26243
- aliyun_trace: unify the span attribute & compatible CMS 2.0 endpoint by @hieheihei in #26194
- fix(api): resolve error in agent‑strategy prompt generator by @quicksandznzn in #26278
- minor: fix translation with the key value uses 「ナレッジの名前とアイコン」 while the rest of the file uses 「ナレッジベース」 by @NeatGuyCoding in #26270
- refactor(web): simplify lint scripts, remove duplicates and standardize naming by @lyzno1 in #26259
- fmt first by @asukaminato0721 in #26221
- fix: resolve UUID parsing error for default user session lookup by @Cluas in #26109
- Fix: avoid mutating node props by @hyongtao-code in #26266
- update gen_ai semconv for aliyun trace by @hieheihei in #26288
- chore: streamline AGENTS.md guidance by @laipz8200 in #26308
- rm assigned but unused by @asukaminato0721 in #25639
- Chore/add sec report by @crazywoola in #26313
- Fix ChatClient.audio_to_text files keyword to make it work by @EchterTimo in #26317
- perf: distribute concurrent pl...
1.9.0 – Orchestrating Knowledge, Powering Workflows
🚀 Introduction
In Dify 1.9.0, we are introducing two major new capabilities: the Knowledge Pipeline and the Queue-based Graph Engine.
The Knowledge Pipeline provides a modularized and extensible workflow for knowledge ingestion and processing, while the Queue-based Graph Engine makes workflow execution more robust and controllable. We believe these will help you build and debug AI applications more smoothly, and we look forward to your experiences to help us continuously improve.
📚 Knowledge Pipeline
✨ Introduction
With the brand-new orchestration interface for knowledge pipelines, we introduce a fundamental architectural upgrade that reshapes how document processing are designed and executed, providing a more modular and flexible workflow that enables users to orchestrate every stage of the pipeline. Enhanced with a wide range of powerful plugins available in the marketplace, it empowers users to flexibly integrate diverse data sources and processing tools. Ultimately, this architecture enables building highly customized, domain-specific RAG solutions that meet enterprises’ growing demands for scalability, adaptability, and precision.
❓ Why Do We Need It?
Previously, Dify's RAG users still encounter persistent challenges in real-world adoption — from inaccurate knowledge retrieval and information loss to limited data integration and extensibility. Common pain points include:
- 🔗 restricted integration of data sources
- 🖼️ missing critical elements such as tables and images
- ✂️ suboptimal chunking results
All of them lead to poor answer quality and hinder the model's overall performance.
In response, we reimagined RAG in Dify as an open and modular architecture, enabling developers, integrators, and domain experts to build document processing pipelines tailored to their specific requirements—from data ingestion to chunk storage and retrieval.
🛠️ Core Capabilities
🧩 Knowledge Pipeline Architecture
The Knowledge Pipeline is a visual, node-based orchestration system dedicated to document ingestion. It provides a customizable way to automate complex document processing, enabling fine-grained transformations and bridging raw content with structured, retrievable knowledge. Developers can build workflows step by step, like assembling puzzle pieces, making document handling easier to observe and adjust.
📑 Templates & Pipeline DSL
- ⚡ Start quickly with official templates
- 🔄 Customize and share pipelines by importing/exporting via DSL for easier reusability and collaboration
🔌 Customizable Data Sources & Tools
Each knowledge base can support multiple data sources. You can seamlessly integrate local files, online documents, cloud drives, and web crawlers through a plugin-based ingestion framework. Developers can extend the ecosystem with new data-source plugins, while marketplace processors handle specialized use cases like formulas, spreadsheets, and image parsing — ensuring accurate ingestion and structured representation.
🧾 New Chunking Strategies
In addition to General and Parent-Child modes, the new Q&A Processor plugin supports Q&A structures. This expands coverage for more use cases, balancing retrieval precision with contextual completeness.
🖼️ Image Extraction & Retrieval
Extract images from documents in multiple formats, store them as URLs in the knowledge base, and enable mixed text-image outputs to improve LLM-generated answers.
🧪 Test Run & Debugging Support
Before publishing a pipeline, you can:
▶️ Execute a single step or node independently- 🔍 Inspect intermediate variables in detail
- 👀 Preview string variables as Markdown in the variable inspector
This provides safe iteration and debugging at every stage.
🔄 One-Click Migration from Legacy Knowledge Bases
Seamlessly convert existing knowledge bases into the Knowledge Pipeline architecture with a single action, ensuring smooth transition and backward compatibility.
🌟 Why It Matters
The Knowledge Pipeline makes knowledge management more transparent, debuggable, and extensible. It is not the endpoint, but a foundation for future enhancements such as multimodal retrieval, human-in-the-loop collaboration, and enterprise-level data governance. We’re excited to see how you apply it and share your feedback.
⚙️ Queue-based Graph Engine
❓ Why Do We Need It?
Previously, designing workflows with parallel branches often led to:
- 🌀 Difficulty managing branch states and reproducing errors
- ❌ Insufficient debugging information
- 🧱 Rigid execution logic lacking flexibility
These issues reduced the usability of complex workflows. To solve this, we redesigned the execution engine around queue scheduling, improving management of parallel tasks.
🛠️ Core Capabilities
📋 Queue Scheduling Model
All tasks enter a unified queue, where the scheduler manages dependencies and order. This reduces errors in parallel execution and makes topology more intuitive.
🎯 Flexible Execution Start Points
Execution can begin at any node, supporting partial runs, resumptions, and subgraph invocations.
🌊 Stream Processing Component
A new ResponseCoordinator handles streaming outputs from multiple nodes, such as token-by-token LLM generation or staged results from long-running tasks.
🕹️ Command Mechanism
With the CommandProcessor, workflows can be paused, resumed, or terminated during execution, enabling external control.
🧩 GraphEngineLayer
A new plugin layer that allows extending engine functionality without modifying core code. It can monitor states, send commands, and support custom monitoring.
Quickstart
- Prerequisites
- Dify version:
1.9.0
or higher
- Dify version:
- How to Enable
- Enabled by default, no additional configuration required.
- Debug mode: set
DEBUG=true
to enable DebugLoggingLayer. - Execution limits:
WORKFLOW_MAX_EXECUTION_STEPS=500
WORKFLOW_MAX_EXECUTION_TIME=1200
WORKFLOW_CALL_MAX_DEPTH=10
- Worker configuration (optional):
WORKFLOW_MIN_WORKERS=1
WORKFLOW_MAX_WORKERS=10
WORKFLOW_SCALE_UP_THRESHOLD=3
WORKFLOW_SCALE_DOWN_IDLE_TIME=30
- Applies to all workflows.
More Controllable Parallel Branches
Execution Flow:
Start ─→ Unified Task Queue ─→ WorkerPool Scheduling
├─→ Branch-1 Execution
└─→ Branch-2 Execution
↓
Aggregator
↓
End
Improvements:
1. All tasks enter a single queue, managed by the Dispatcher.
2. WorkerPool auto-scales based on load.
3. ResponseCoordinator manages streaming outputs, ensuring correct order.
Example: Command Mechanism
from core.workflow.graph_engine.manager import GraphEngineManager
# Send stop command
GraphEngineManager.send_stop_command(
task_id="workflow_task_123",
reason="Emergency stop: resource limit exceeded"
)
Note: pause/resume functionality will be supported in future versions.
Example: GraphEngineLayer
FAQ
-
Is this release focused on performance?
No. The focus is on stability, clarity, and correctness of parallel branches. Performance improvements are a secondary benefit. -
What events can be subscribed to?
- Graph-level: GraphRunStartedEvent, GraphRunSucceededEvent, GraphRunFailedEvent, GraphRunAbortedEvent
- Node-level: NodeRunStartedEvent, NodeRunSucceededEvent, NodeRunFailedEvent, NodeRunRetryEvent
- Container nodes: IterationRunStartedEvent, IterationRunNextEvent, IterationRunSucceededEvent, LoopRunStartedEvent, LoopRunNextEvent, LoopRunSucceededEvent
- Streaming output: NodeRunStreamChunkEvent
-
How can I debug workflow execution?
- Enable
DEBUG=true
to view detailed logs. - Use DebugLoggingLayer to record events.
- Add custom monitoring via GraphEngineLayer.
- Enable
Future Plans
This release is just the beginning. Upcoming improvements include:
- Debugging Tools: A visual interface to view execution states and variables in real time.
- Intelligent Scheduling: Optimize scheduling strategies using historical data.
- More Complete Command Support: Add Pause/Resume, breakpoint debugging.
- Human in the Loop: Support human intervention during execution.
- Subgraph Functionality: Enhance modularity and reusability.
- Multimodal Embedding: Support richer content types beyond text.
We look forward to your feedback and experiences to make the engine more practical.
Upgrade Guide
Important
After upgrading, you must run the following migration to transform existing datasource credentials. This step is required to ensure compatibility with the new version:
uv run flask transform-datasource-credentials
Docker Compose Deployments
- Back up your customized docker-compose YAML file (optional)
cd docker
cp docker-compose.yaml docker-compose.yaml.$(date +%s...
v2.0.0-beta.2
Fixes
- Fixed an issue in Workflow / Chatflow where using an LLM node with Memory could cause errors.
- Fixed a blocking issue in non-pipeline mode when adding new Notion pages to the document list.
- Fixed dark mode styling issues.
Upgrade Guide
Important
If upgrading from 0.x or 1.x, you must run the following migration to transform existing datasource credentials. This step is required to ensure compatibility with the new version:
uv run flask transform-datasource-credentials
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 2.0.0-beta.2
git pull origin 2.0.0-beta.2
- 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
- Migrate data after the container starts
docker exec -it docker-api-1 uv run flask transform-datasource-credentials
Source Code Deployments
-
Stop the API server, Worker, and Web frontend Server.
-
Get the latest code from the release branch:
git checkout 2.0.0-beta.2
- Update Python dependencies:
cd api
uv sync
- Then, let's run the migration script:
uv run flask db upgrade
uv run flask transform-datasource-credentials
- Finally, run the API server, Worker, and Web frontend Server again.
v2.0.0-beta.1 – Orchestrating Knowledge, Powering Workflows
🚀 Introduction
In Dify 2.0, we are introducing two major new capabilities: the Knowledge Pipeline and the Queue-based Graph Engine.
This is a beta release, and we hope to explore these improvements together with you and gather your feedback. The Knowledge Pipeline provides a modularized and extensible workflow for knowledge ingestion and processing, while the Queue-based Graph Engine makes workflow execution more robust and controllable. We believe these will help you build and debug AI applications more smoothly, and we look forward to your experiences to help us continuously improve.
📚 Knowledge Pipeline
✨ Introduction
With the brand-new orchestration interface for knowledge pipelines, we introduce a fundamental architectural upgrade that reshapes how document processing are designed and executed, providing a more modular and flexible workflow that enables users to orchestrate every stage of the pipeline. Enhanced with a wide range of powerful plugins available in the marketplace, it empowers users to flexibly integrate diverse data sources and processing tools. Ultimately, this architecture enables building highly customized, domain-specific RAG solutions that meet enterprises’ growing demands for scalability, adaptability, and precision.
❓ Why Do We Need It?
Previously, Dify's RAG users still encounter persistent challenges in real-world adoption — from inaccurate knowledge retrieval and information loss to limited data integration and extensibility. Common pain points include:
- 🔗 restricted integration of data sources
- 🖼️ missing critical elements such as tables and images
- ✂️ suboptimal chunking results
All of them lead to poor answer quality and hinder the model's overall performance.
In response, we reimagined RAG in Dify as an open and modular architecture, enabling developers, integrators, and domain experts to build document processing pipelines tailored to their specific requirements—from data ingestion to chunk storage and retrieval.
🛠️ Core Capabilities
🧩 Knowledge Pipeline Architecture
The Knowledge Pipeline is a visual, node-based orchestration system dedicated to document ingestion. It provides a customizable way to automate complex document processing, enabling fine-grained transformations and bridging raw content with structured, retrievable knowledge. Developers can build workflows step by step, like assembling puzzle pieces, making document handling easier to observe and adjust.
📑 Templates & Pipeline DSL
- ⚡ Start quickly with official templates
- 🔄 Customize and share pipelines by importing/exporting via DSL for easier reusability and collaboration
🔌 Customizable Data Sources & Tools
Each knowledge base can support multiple data sources. You can seamlessly integrate local files, online documents, cloud drives, and web crawlers through a plugin-based ingestion framework. Developers can extend the ecosystem with new data-source plugins, while marketplace processors handle specialized use cases like formulas, spreadsheets, and image parsing — ensuring accurate ingestion and structured representation.
🧾 New Chunking Strategies
In addition to General and Parent-Child modes, the new Q&A Processor plugin supports Q&A structures. This expands coverage for more use cases, balancing retrieval precision with contextual completeness.
🖼️ Image Extraction & Retrieval
Extract images from documents in multiple formats, store them as URLs in the knowledge base, and enable mixed text-image outputs to improve LLM-generated answers.
🧪 Test Run & Debugging Support
Before publishing a pipeline, you can:
▶️ Execute a single step or node independently- 🔍 Inspect intermediate variables in detail
- 👀 Preview string variables as Markdown in the variable inspector
This provides safe iteration and debugging at every stage.
🔄 One-Click Migration from Legacy Knowledge Bases
Seamlessly convert existing knowledge bases into the Knowledge Pipeline architecture with a single action, ensuring smooth transition and backward compatibility.
🌟 Why It Matters
The Knowledge Pipeline makes knowledge management more transparent, debuggable, and extensible. It is not the endpoint, but a foundation for future enhancements such as multimodal retrieval, human-in-the-loop collaboration, and enterprise-level data governance. We’re excited to see how you apply it and share your feedback.
⚙️ Queue-based Graph Engine
❓ Why Do We Need It?
Previously, designing workflows with parallel branches often led to:
- 🌀 Difficulty managing branch states and reproducing errors
- ❌ Insufficient debugging information
- 🧱 Rigid execution logic lacking flexibility
These issues reduced the usability of complex workflows. To solve this, we redesigned the execution engine around queue scheduling, improving management of parallel tasks.
🛠️ Core Capabilities
📋 Queue Scheduling Model
All tasks enter a unified queue, where the scheduler manages dependencies and order. This reduces errors in parallel execution and makes topology more intuitive.
🎯 Flexible Execution Start Points
Execution can begin at any node, supporting partial runs, resumptions, and subgraph invocations.
🌊 Stream Processing Component
A new ResponseCoordinator handles streaming outputs from multiple nodes, such as token-by-token LLM generation or staged results from long-running tasks.
🕹️ Command Mechanism
With the CommandProcessor, workflows can be paused, resumed, or terminated during execution, enabling external control.
🧩 GraphEngineLayer
A new plugin layer that allows extending engine functionality without modifying core code. It can monitor states, send commands, and support custom monitoring.
Quickstart
- Prerequisites
- Dify version:
2.0.0-beta.1
or higher
- Dify version:
- How to Enable
- Enabled by default, no additional configuration required.
- Debug mode: set
DEBUG=true
to enable DebugLoggingLayer. - Execution limits:
WORKFLOW_MAX_EXECUTION_STEPS=500
WORKFLOW_MAX_EXECUTION_TIME=1200
WORKFLOW_CALL_MAX_DEPTH=10
- Worker configuration (optional):
WORKFLOW_MIN_WORKERS=1
WORKFLOW_MAX_WORKERS=10
WORKFLOW_SCALE_UP_THRESHOLD=3
WORKFLOW_SCALE_DOWN_IDLE_TIME=30
- Applies to all workflows.
More Controllable Parallel Branches
Execution Flow:
Start ─→ Unified Task Queue ─→ WorkerPool Scheduling
├─→ Branch-1 Execution
└─→ Branch-2 Execution
↓
Aggregator
↓
End
Improvements:
1. All tasks enter a single queue, managed by the Dispatcher.
2. WorkerPool auto-scales based on load.
3. ResponseCoordinator manages streaming outputs, ensuring correct order.
Example: Command Mechanism
from core.workflow.graph_engine.manager import GraphEngineManager
# Send stop command
GraphEngineManager.send_stop_command(
task_id="workflow_task_123",
reason="Emergency stop: resource limit exceeded"
)
Note: pause/resume functionality will be supported in future versions.
Example: GraphEngineLayer
FAQ
-
Is this release focused on performance?
No. The focus is on stability, clarity, and correctness of parallel branches. Performance improvements are a secondary benefit. -
What events can be subscribed to?
- Graph-level: GraphRunStartedEvent, GraphRunSucceededEvent, GraphRunFailedEvent, GraphRunAbortedEvent
- Node-level: NodeRunStartedEvent, NodeRunSucceededEvent, NodeRunFailedEvent, NodeRunRetryEvent
- Container nodes: IterationRunStartedEvent, IterationRunNextEvent, IterationRunSucceededEvent, LoopRunStartedEvent, LoopRunNextEvent, LoopRunSucceededEvent
- Streaming output: NodeRunStreamChunkEvent
-
How can I debug workflow execution?
- Enable
DEBUG=true
to view detailed logs. - Use DebugLoggingLayer to record events.
- Add custom monitoring via GraphEngineLayer.
- Enable
Future Plans
This beta release is just the beginning. Upcoming improvements include:
- Debugging Tools: A visual interface to view execution states and variables in real time.
- Intelligent Scheduling: Optimize scheduling strategies using historical data.
- More Complete Command Support: Add Pause/Resume, breakpoint debugging.
- Human in the Loop: Support human intervention during execution.
- Subgraph Functionality: Enhance modularity and reusability.
- Multimodal Embedding: Support richer content types beyond text.
We look forward to your feedback and experiences to make the engine more practical.
Upgrade Guide
Important
After upgrading, you must run the following migration to transform existing datasource credentials. This step is required to ensure compatibility with the new version:
uv run flask transform-datasource-credentials
Docker Compose Deployments
- Back up your cus...
v1.8.1
🌟 What's New in v1.8.1? 🌟
Welcome to version 1.8.1! 🎉🎉🎉 This release focuses on stability, performance improvements, and developer experience enhancements. We've built great features and resolved critical database issues based on community feedback.
🚀 Features
- Export DSL from History: Able to export workflow DSL directly from version history panel. (See #24939, by GuanMu)
- Downvote with Reason: Enhanced feedback system allowing users to provide specific reasons when downvoting responses. (See #24922, by jubinsoni)
- Multi-modal/File: Added filename support to multi-modal prompt messages. (See #24777, by -LAN-)
- Advanced Chat File Handling: Improved assistant content parts and file handling in advanced chat mode. (See #24663, by QIN2DIM)
⚡ Enhancements
- DB Query: Optimized SQL queries that were performing partial full table scans. (See #24786, by Novice)
- Type Checking: Migrated from MyPy to Basedpyright. (See #25047, by -LAN-)
- Indonesian Language Support: Added Indonesian (id-ID) language support. (See #24951, by lyzno1)
- Jinja2 Template: LLM prompt Jinja2 templates now support more variables. (See #24944, by 17hz)
🐛 Fixes
- Security/XSS: Fixed XSS vulnerability in block-input and support-var-input components. (See #24835, by lyzno1)
- Persistence Session Management: Resolved critical database session binding issues that were causing "not bound to a Session" errors. (See #25010, #24966, by Will)
- Workflow & UI Issues: Fixed workflow publishing problems, resolved UUID v7 conflicts, and addressed various UI component issues including modal handling and input field improvements. (See #25030, #24643, #25034, #24864, by Will, -LAN-, 17hz & Atif)
Version 1.8.1 represents a significant step forward in platform stability and developer experience. The migration to modern type checking and database systems, combined with comprehensive bug fixes, creates a more robust foundation for future features.
Huge thanks to all our contributors who made this release possible! We welcome your ongoing feedback to help us continue improving the platform together.
Upgrade Guide
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.8.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: datasets hit-testing retrieve chunking detail answer when docum… by @lcedaw in #24600
- feat: migrate part of the web API module to Flask-RESTX by @liugddx in #24577
- chore: optimize pnpm version management and migrate from next lint to eslint cli by @lyzno1 in #24514
- Refactor: replace count() > 0 check with exists() by @hyongtao-code in #24583
- Fix/web app auth error by @douxc in #24637
- add more current_user typing by @asukaminato0721 in #24612
- Fix token expiry miscalculation by @hyongtao-code in #24639
- fix:
files
parameter in JavaScript sdk incorrectly annotated as theFile
type in WebAPI by @sheey11 in #24644 - fix: workflow log panel's round style by @ZeroZ-lab in #24658
- feat: migrate part of the web chat module to Flask-RESTX by @liugddx in #24664
- refactor: Migrate part of the web API module to Flask-RESTX by @liugddx in #24659
- Feature add test containers workflow service by @NeatGuyCoding in #24666
- example try rm ignore by @asukaminato0721 in #24649
- Typing test by @asukaminato0721 in #24651
- example for rm extra cast by @asukaminato0721 in #24646
- chore: Plugin_daemon Service Add Sentry configuration by @Hwting in #24516
- chore: bump supabase and pyjwt versions and added tests by @chazzhou in #24681
- fix_trace_config by @mr0609 in #24669
- fix: can not choose file type var in aggreggator node by @iamjoel in #24689
- feat: add MCP configuration for Claude Code optimization by @lyzno1 in #24679
- refactor: relocate China npm registry config to base image by @17hz in #24678
- ✨fix: has_more logic in ChatMessageListApi to ensure correct on behavior when no more messages are available. by @Eric-Guo in #24661
- clean typos words. by @zhanluxianshen in #24667
- fix: Default value for input variable is null when starting new conversations on the web app by @17hz in #24709
- chore: simplify the workflow details logic by @crazywoola in #24714
- chore: fix some api desc by @zalcit in #24715
- feat: Add support for slash commands, optimize command selector logic. by @ZeroZ-lab in #24723
- chore: use DataFrame.map instead of deprecated DataFrame.applymap by @IthacaDream in #24726
- chore: cleanup unnecessary mypy suppressions on imports by @bowenliang123 in #24712
- chore: translate i18n files by @github-actions[bot] in #24727
- fix: unclosing tag by @crazywoola in #24733
- Chore: remove dead func AppModelConfig.copy() with wrong logic by @hyongtao-code in #24747
- feat: add test containers based tests for workspace service by @NeatGuyCoding in #24752
- fix: inconsistent text color for settings button in webapp cards by @lyzno1 in #24754
- feat: orchestrate CI workflows to prevent duplicate runs when autofix makes changes by @laipz8200 in #24758
- chore: use orjson in streaming event JSON serialisation for performance improvement by @bowenliang123 in #24763
- feat: oauth provider by @RockChinQ in #24206
- Chore: remove dupliacte logic in DatasetApi.get() by @kenwoodjw in #24769
- chore: translate i18n files by @github-actions[bot] in #24770
- feat(api): maintain assistant content parts and file handling in advanced chat by @QIN2DIM in #24663
- fix(web): fix error notify when tagInput component is not required (#… by @zyileven in #24774
- refactor: Promote basepath to environment variable by @17hz in #24445
- feat: add filename support to multi-modal prompt messages by @laipz8200 in #24777
- fix(web): improve floating UI positioning when scrolling (#24595) by @zyileven in #24782
- chore: change the oauth_provider_apps table to uuidV7 by @hjlarry in #24792
- fix: change the mcp server strucutre to support github copilot by @Nov1c444 in #24788
- fix(api): fix
DetachedInstanceError
for Account.current_tenant_id by @QuantumGhost in #24789 - chore(api): fix Alembic offline migration compatibility by @QuantumGhost in #24795
- fix: add missing statuses permission to main CI workflow by @laipz8200 in #24809
- refactor: remove duplicate pull_request triggers from workflow files by @laipz8200 in #24814
- refactor: reorganize the CI pipeline by @laipz8200 in #24817
- fix: workflow_finish_to_stream_response assert exception with celery … by @horochx in #24674
- Fix: rm invalid errorMessage on e.toString() by @hyongtao-code in #24805
- chore[docker]: Fix Redis health check error but display healthy by @Hwting in #24778
- poc of validate config by @asukaminato0721 in #24837
- Remove redundant from_variable_selector null-check by @hyongtao-code in #24842
- Feature add test containers mcp ...
v1.8.0 - Async workflows meet multi-model management with OAuth-powered integrations.

🎉 Dify v1.8.0 Release Notes 🎉
Hello, Dify community! We're excited to bring you version 1.8.0, packed with significant improvements across the board - from enhanced security and performance optimizations to a revamped UI and powerful new workflow features. Let's dive into what's new!
🚀 New Features
Workflow & Agent Capabilities
- Multi-Model Credentials System: Implemented a comprehensive multi-model credentials system with new database tables, enabling more flexible model management. Thanks to @hjlarry! (#24451)
- MCP Support with OAuth: Added Model Context Protocol (MCP) support for resource discovery with OAuth authentication, expanding integration possibilities. Kudos to @CodeSpaceiiii! (#24223)
- Default Values for Workflow Variables: All workflow start node variable types now support default values, making workflows more robust. Thanks to @17hz! (#24129)
- Agent Node Token Usage: Exposed agent node usage metrics for better monitoring and optimization. Thanks to @DavideDelbianco! (#24355)
UI/UX Enhancements
- Document Sorting in Knowledge Base: Added sorting functionality for document status in the Knowledge base, improving document management. Thanks to @jubinsoni! (#24252)
- Delete Avatar Functionality: Users can now delete their avatars with a confirmation modal for safety. Thanks to @Zhehao-P! (#24099)
- Extensible Goto-Anything Commands: Improved goto-anything commands with an extensible architecture for better navigation. Thanks to @ZeroZ-lab! (#24091)
- Document Name Tooltips: Added helpful tooltips to document names in lists for better visibility. Thanks to @aopstudio! (#24467)
- Auto-login After Setup: Implemented secure auto-login after admin account setup. Thanks to @laipz8200! (#24395)
API & Backend
- Redis SSL/TLS Authentication: Added support for Redis SSL/TLS certificate authentication for enhanced security. Thanks to @laipz8200! (#23624)
- Flask-RESTX Migration: Successfully migrated from Flask-RESTful to Flask-RESTX for better API documentation and structure. Thanks to @asukaminato0721! (#24310)
- Swagger Authorization: Added authorization configuration support to Swagger documentation. Thanks to @hjlarry! (#24518)
🐛 Bug Fixes
Critical Fixes
- Database Performance: Fixed major performance issue by removing provider table updates on every message creation. Thanks to @QuantumGhost! (#24520)
- Authentication Error Handling: Fixed login error handling by properly raising exceptions instead of returning. Thanks to @laipz8200! (#24452)
- OAuth Redis Compatibility: Resolved OAuth Redis compatibility issues. Thanks to @Mairuis! (#23959)
- HTTP Request Node File Access: Fixed file access from Start Node with remote URLs in HTTP Request Node. Thanks to @dlmu-lq! (#24293)
Workflow Improvements
- Loop Exit Conditions: Fixed loop exit condition to accept variables from nodes inside loops. Thanks to @baonudesifeizhai! (#24257)
- Agent Node Token Counting: Properly separated prompt and completion tokens in agent node token counting. Thanks to @laipz8200! (#24368)
- Number Input in Tool Configure: Fixed number input behavior in agent node tool configuration. Thanks to @Stream29! (#24152)
- Delete Conversations via API: Fixed conversation deletion through API to properly remove from database. Thanks to @jubinsoni! (#23591)
UI/UX Fixes
- Dark Mode Improvements: Multiple dark mode fixes including backdrop-blur for plugin dropdowns, hover button contrast, and embedded modal icons. Thanks to @lyzno1 and team!
- React Warnings: Fixed Next.js React warnings by properly moving shareCode updates to useEffect. Thanks to @Eric-Guo! (#24468)
- Border Radius Consistency: Fixed UI border radius inconsistencies across components. Thanks to @jubinsoni! (#24486)
🔒 Security Enhancements
- User Enumeration Prevention: Standardized authentication error messages to prevent user enumeration attacks. Thanks to @laipz8200! (#24324)
- Custom Headers Fix: Fixed custom headers being ignored when using bearer or basic authorization. Thanks to @liugddx! (#23584)
- Fix SQL Injection in Oracle VDB.
⚡ Performance & Infrastructure
Workflow Performance Breakthrough
- Async WorkflowRun/WorkflowNodeRun Repositories: Implemented asynchronous repositories for workflow execution, delivering dramatic performance improvements. This architectural change enables non-blocking operations during workflow runs, with early testing showing execution times nearly halved in typical workflows. This optimization particularly benefits complex workflows with multiple nodes and parallel operations. Thanks to @xinlmain for this game-changing performance enhancement! (#20050)
Database Optimizations
- Semantic Version Comparison: Implemented semantic version comparison for vector database version checks. Thanks to @MatriQ! (#24416)
- AnalyticDB Improvements: Fixed rollback issues when AnalyticDB create zhparser failed. Thanks to @lpdink! (#24260)
- Dataset Cleanup: Optimized dataset cleanup task for better performance. Thanks to @aopstudio! (#24467)
Testing Infrastructure
- Comprehensive Test Coverage: Added testcontainers-based integration tests for multiple services including workflow app, website, auth, conversation, and more. Massive thanks to @NeatGuyCoding for this extensive testing effort!
- Rate Limiting Tests: Added comprehensive test suite for rate limiting module. Thanks to @farion1231! (#23765)
Docker & Deployment
- Docker Build Optimization: Optimized Docker build process with cleanup script for Jest work files. Thanks to @WTW0313! (#24450)
- Amazon ECS Deployment: Added deployment pattern documentation using Amazon ECS and CDK. Thanks to @tmokmss! (#23985)
- Configurable Plugin Buffer Sizes: Added configurable stdio buffer sizes for plugins in compose file. Thanks to @crazywoola! (#23980)
📚 Documentation
- CLAUDE.md for LLM Development: Added comprehensive CLAUDE.md file for LLM-assisted development guidance. Thanks to @laipz8200! (#23946)
- API Documentation: Enhanced API documentation for files endpoint, MCP, and service API. Thanks to @laipz8200!
- Localized Documentation: Updated localized README files to link to corresponding localized CONTRIBUTING.md files. Thanks to @aopstudio! (#24504)
- Markdown Auto-formatting: Implemented auto-formatting for markdown files using mdformat tool. Thanks to @asukaminato0721! (#24242)
🧹 Code Quality & Refactoring
- Type Safety Improvements: Major improvements to type annotations and static type checking across the codebase. Thanks to @Gnomeek, @hyongtao-code, and @asukaminato0721!
- AST-Grep Integration: Added ast-grep tool for maintaining codebase consistency. Thanks to @asukaminato0721! (#24149)
- Dead Code Removal: Cleaned up empty files and unused code throughout the project. Thanks to @hyongtao-code! (#23990)
- Import Optimization: Replaced deprecated functions and optimized imports across the codebase.
🌐 Internationalization
- Automated Translation Updates: Continuous updates to i18n translation files with improved accuracy
- Japanese Translation Corrections: Fixed Japanese translation issues. Thanks to @kurokobo! (#24041)
- Translation Synchronization: Better synchronization of translations across all supported languages
This release represents a major step forward in Dify's evolution, with substantial improvements to performance, security, and developer experience. We're particularly excited about the enhanced workflow capabilities and the comprehensive testing infrastructure that will help us maintain high quality standards going forward.
Thank you to all contributors who made this release possible! Your dedication to improving Dify continues to drive us forward.
Happy building with Dify 1.8.0! 🚀
Upgrade Guide
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.8.0
-
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
- test(api): fix flaky tests in TestWorkflowDraftVariableService by @QuantumGhost in #23749
- refactor: simplify variable pool key structure and improve type safety by @laipz8200 in #23732
- refactor: Change _queue_manager to public attribute queue_manager in task pipelines by @laipz8200 in #23747
- Chore: remove unused var in
ModelProviderFactory
by @hyongtao-code in #23690 - feat: add filtering support for @ command selector in goto-anything by @lyzno1 in #23763
- hotfix: fix translation by @NeatGuyCoding in #2375...
v1.7.2
✨ What’s New in v1.7.2? ✨
Alright folks, buckle up! Version 1.7.2 is here, packed with a ton of quality-of-life improvements, bug fixes, and some slick new features to make your Dify experience even smoother. This release has been a community effort, and we want to give a big shoutout to all the contributors, especially the new folks who jumped in – welcome to the party! 🎉
🚀 Major Feature: Workflow Visualization
A new relations panel allows you to visualize dependencies within your workflows. Big thanks to @Minamiyama for #21998! Now when you select any node and press Shift
, you will see magic flowing lines.

🚀 Major Feature: Node Search
You can now easily find nodes in the workflow editor using the new search feature by @croatialu, @ZeroZ-lab, @HyaCiovo, @MatriQ, @lyzno1, @crazywoola in #23685.

⚙️ Enhancements
- Notion Database Row Extraction: The Notion Database integration now extracts rows in their original order and appends the Row Page URL. Thanks @ThreeFish-AI! #22646
- Workflow API Version Specification: You can now specify workflow versions in the workflow and chat APIs. Thanks, @qiaofenlin! #23188
- Tool JSON Response: Datetime and UUID are now supported in tool JSON responses, making those integrations even more powerful. Kudos to @jiangbo721! #22738
- API Documentation: The API documentation has been revamped with a modern design and improved UX. Thanks @lyzno1! #23490
- Workflow Node Alignment: Get those workflows looking sharp with enhanced node alignment options. Thanks, @ZeroZ-lab! #23451
- Service API File Preview Endpoint: A new endpoint to preview service API files, making it easier to manage and debug your services. Hat tip to @lyzno1! #23534
- Testcontainers Tests: We're serious about stability! @NeatGuyCoding and others have been hard at work adding Testcontainers tests for various services (account, app, message, workflow etc.) ensuring our services are rock solid.
🛠️ Bug Fixes
- Full-Text Search with Tencent Cloud VectorDB: Fixed an issue where metadata filters weren't being applied correctly in full-text search mode for Tencent Cloud VectorDB. Thanks, @dlmu-lq! #23564
- Workflow Knowledge Retrieval Cache: Fixed a cache bug in workflow knowledge retrieval. Another one bites the dust, thanks to @yunqiqiliang! #23597
- HTTP Request Component: Resolved a multipart/form-data boundary issue in the HTTP Request component. Thanks to @baonudesifeizhai for fixing this long-standing issue! #23008
- Conversation Variable Sync: Fixed an issue where conversation variables weren't being synced for existing conversations. Thanks to @laipz8200 for hunting this down! #23649
- Internationalization (i18n): Numerous i18n fixes and enhancements across the board. Shoutout to @lyzno1 and the i18n team for their dedication!
- Edge Cases Handled: We squashed a number of edge-case bugs, thanks to the contributions of many in the community.
🛡️ Security
- XSS Vulnerability: A big thank you to @lyzno1 for identifying and fixing an XSS vulnerability in the authentication check-code pages. #23295
Upgrade Guide
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.7.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
- Fixed code formatting issues in the comment header option component by @ZeroZ-lab in #23060
- fix: web SSO login redirect to correct basePath and origin by @chunglam2525 in #23058
- minor fix: using the same AccountInFreezeError by @NeatGuyCoding in #23061
- fix(i18n): Complete missing translations and clean up legacy keys in app-debug across all locales (#23062) by @lyzno1 in #23065
- Fix/23066 i18n related commands are broken by @crazywoola in #23071
- dark mode for overlay by @jubinsoni in #23078
- fix(scripts): resolve i18n check script path and logic issues by @lyzno1 in #23069
- Refactor: remove redundant full module paths in exception handlers by @hyongtao-db in #23076
- ability to click classifier during workflow execution by @jubinsoni in #23079
- Fix: number input can display 0 by @JzoNgKVO in #23084
- minor fix: fix error messages by @NeatGuyCoding in #23081
- Fix Empty Collection WHERE Filter Issue by @NeatGuyCoding in #23086
- Fix variable config by @ZeroZ-lab in #23070
- feat: update banner by @crazywoola in #23095
- chore: base form by @zxhlyh in #23101
- hotfix: clear_all_annotations should also execute delete_annotation_index_task just like delete_app_annotation by @NeatGuyCoding in #23093
- minor fix: wrong assignment by @NeatGuyCoding in #23103
- minor fix: fix some translation by @NeatGuyCoding in #23105
- Feat/enhance i18n scripts by @lyzno1 in #23114
- refactor: pass external_trace_id to message trace by @wrfly in #23089
- minor fix: wrong position of retry_document_indexing_task time elapsed by @NeatGuyCoding in #23099
- fix: i18n link in README.md by @crazywoola in #23121
- fix(web): make iteration panel respect MAX_PARALLEL_LIMIT environment variable (#23083) by @lyzno1 in #23104
- minor fix: Object of type int64 is not JSON serializable by @leslie2046 in #23109
- Fix/http node timeout validation#23077 by @baonudesifeizhai in #23117
- fix: metadata API nullable validation consistency issue by @lyzno1 in #23133
- Fix: add missing db.session.close() to ensure proper session cleanup by @hyongtao-db in #23122
- Chore: use
Workflow.VERSION_DRAFT
instead of hardcodeddraft
by @hyongtao-db in #23136 - request fail when no api key by @jubinsoni in #23135
- Fix: prevent KeyError in validate_api_list by correcting logical check by @hyongtao-db in #23126
- fix(i18n): clean up unused keys and fix nesting & placeholder issues by @lyzno1 in #23123
- Fix: Support for Elasticsearch Cloud Connector by @nurrochmanmuhammad in #23017
- fix: disabled auto update but still show in plugin detail by @iamjoel in #23150
- Feat annotations panel by @ZeroZ-lab in #22968
- fix: element of Array[string] and Array[number] and size attribution by @leslie2046 in #23074
- feat: support metadata condition filter string array by @kenwoodjw in #23111
- fix: Support URL-encoded passwords with special characters in CELERY_BROKER_URL by @Sn0rt in #23163
- minor fix: fix wrong check of annotation_ids by @NeatGuyCoding in #23164
- minor fix: fix flask api resources only accept one resource for same url by @NeatGuyCoding in #23168
- fix: Error processing trace tasks by @IthacaDream in #23170
- chore(i18n): sync missing keys in zh-Hans and ja-JP by @lyzno1 in #23175
- chore: Update vulnerable eslint dependencies by @WTW0313 in #23192
- feat(notion): Notion Database extracts Rows content
in row order
and appendsRow Page URL
by @ThreeFish-AI in #22646 - feat: Enable Tracing Support For Phoenix Cloud Instance by @ialisaleh in #23196
- fixing embedded chat styling by @jubinsoni in #23198
- fix: prevent client-side crashes from null/undefined plugin data in workflow (#23154) by @lyzno1 in #23182
- ...
v1.7.1
🎉 Dify v1.7.1 Release Notes 🎉
Hello, Dify enthusiasts! We're thrilled to announce version 1.7.1 of our platform, bringing a fresh batch of refinements and enhancements to your workflow. Here's a breakdown of what's changed:
🚀 New Features
-
Default Value for Select Inputs: Now you can set a default value for select input fields, providing a smoother user experience when working with forms. Thanks to @antonko. (#21192)
-
Selecting Variables in Conditional Filters: We've added the capability to select variables in conditional filtering within list operations. This feature, spearheaded by @leslie2046, will streamline data manipulation tasks. (#23029)
-
OpenAPI Schema Enhancement: Support for
allOf
in OpenAPI properties inside schema has been added, courtesy of @mike1936. It's a big win for API design consistency. (#22975) -
K8s Pure Migration Option: We've introduced a pure migration option for the
api
component within Kubernetes deployments, making migrations simpler for large-scale systems. Thanks, @BorisPolonsky ! (#22750)
⚙️ Bug Fixes
-
Langfuse Integration Path: Incorrect path handling with Langfuse integration has been corrected by @chenguowei. Now it behaves just right within your API calls. (#22766)
-
CELERY_BROKER Improvements: For those using RabbitMQ, the broker handling issue during batch document segment additions has been addressed by @zhaobingshuang. No more endless processing status! (#23038)
-
Metadata Batch Edit Cross-page Issue: Resolved a previous issue with cross-page document selection during metadata batch edits. Thanks to @liugddx for smoothing out the workflow. (#23000)
-
Windows PEM KeyPath Fix: Corrected path errors for private.pem key files on Windows systems, ensuring cross-platform reliability. Thanks to @silencesdg. (#22814)
🔄 Improvements
-
ToolTip Component Refinement: We've refined the interaction of ToolTip components within menus to enhance readability and usability. Kudos to @HyaCiovo for this optimization. (#23023)
-
PostgreSQL Healthcheck: Enhanced the healthcheck command to avoid fatal log errors in PostgreSQL. Thanks to @J2M3L2's talismanic touch. (#22749)
-
Time Formatting Internationalization: The time formatting feature has been refactored for better international support, thanks to @HyaCiovo. (#22870)
🪄 Miscellaneous
-
Revamped Tool List Page: @nite-knite made the tool list page slicker and more user-friendly—check it out! (#22879)
-
Duplicate TYPE_CHECKING Import: Removed those unnecessary imports for sleeker code. Thanks, @hyongtao-db. (#23013)
Pulling all these improvements together, this release takes a big step forward in polishing everyday experiences and paving the way for future development. Enjoy the upgrade, and as always, reach out with feedback and ideas for what you'd love to see next. Keep coding! 🚀
Upgrade Guide
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.7.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
- fix: tablestore TypeError when vector is missing by @wanttobeamaster in #22843
- fix tablestore full text search bug by @wanttobeamaster in #22853
- test: add comprehensive integration tests for API key authentication system by @farion1231 in #22856
- fix: private.pem keyPath error in windows by @silencesdg in #22814
- feat(k8s): Add pure migration option for
api
component by @BorisPolonsky in #22750 - refactor: Change "filter" to "where" to match SQLAlchemy 2.x style. by @asukaminato0721 in #22801
- feat: Add user variable processing function to chat history by @croatialu in #22863
- chore: code format model-selector use enum by @jiangbo721 in #22787
- add autofix by @asukaminato0721 in #22785
- refactor(dayjs): Refactor internationalized time formatting feature (#22870) by @HyaCiovo in #22872
- fix: improved conversation name by @IthacaDream in #22840
- feat: revamp tool list page by @nite-knite in #22879
- fix: type error in list-operator by @leslie2046 in #22803
- Feat: add notification for change email completed by @JzoNgKVO in #22812
- refactor(i18next): streamline fallback translation handling and initi… by @WTW0313 in #22894
- fix: support authorization using session and user_id in URL. by @douxc in #22898
- fix(plugins_select): Adjust z-index, fix issue where options cannot be displayed (#22873) by @HyaCiovo in #22893
- Feat/change user email freezes limit by @zyssyz123 in #22900
- fix: refine handling of constant and mixed input types in ToolManager and ToolNodeData by @Yeuoly in #22903
- fix: rounded by @ZeroZ-lab in #22909
- fix: Optimize input variable retrieval logic (#22888) by @HyaCiovo in #22914
- chore: enhance error message when handling PluginInvokeError by @Yeuoly in #22908
- Feat: change user email freezes limit by @JzoNgKVO in #22912
- fix: unexpected redirection when landing at workflow by @JzoNgKVO in #22932
- Improve: support custom model parameters in auto-generator by @quicksandznzn in #22924
- chore: translate i18n files by @github-actions[bot] in #22934
- fix: improve PostgreSQL healthcheck cmd to avoid fatal log errors (#22749) by @J2M3L2 in #22917
- test: add comprehensive tests for file_factory build_from_mapping by @farion1231 in #22926
- fix: Optimize AppInfo component styles and fix CustomizeModal step display (#22930) by @HyaCiovo in #22935
- make logging not use f-str, change others to f-str by @asukaminato0721 in #22882
- fix: correct typo in function name paser_docx_part -> parser_docx_part by @little-huang in #22936
- fix: Refactor i18n config and fix plugin search box styling issue by @WTW0313 in #22945
- fix: Update the scheduling method for timed tasks, by @ZeroZ-lab in #22779
- Fix incorrect assert type in the AgentNode class by @hyongtao-db in #22964
- feat: clear all annotation by @leslie2046 in #22878
- Remove redundant condition check by @hyongtao-db in #22983
- adding mcp error in toast by @jubinsoni in #22987
- fix: Update trigger styles for disabled state in PureSelect component by @weijunjiang123 in #22986
- fix: eliminate dark mode flicker by moving ThemeProvider to root level by @lyzno1 in #22996
- Fix: correct misplaced
ensure_ascii=False
by @hyongtao-db in #22997 - node title number on copied iteration node by @jubinsoni in #23004
- adding LANG LC_ALL PYTHONIOENCODING UTF-8 by @jubinsoni in #22928
- fix: resolve cross-page document selection issue in metadata batch edit by @liugddx in #23000
- fix: Improve create_agent_thought and save_agent_thought Logic by @IthacaDream in #21263
- ability to select same type sub item by preserving children of both f… by @jubinsoni in #23002
- Chore: remove duplicate TYPE_CHECKING import by @hyongtao-db in #23013
- refactor(web): Optimize the interaction effect of ToolTip component in menu items (#23020) by @HyaCiovo in #23023
- Rollback Aliyun Trace Icon File by @hieheihei in #23027
- feat: Support allOf in OpenAPI properties inside schema #22946 by @mike1936 in #22975
- chore: Updata eslint config dependencies by @WTW0313 in https://github.com/langgenius/dify/pull...
v1.7.0 - Tool OAuth & Plugin Auto-Upgrade Enhanced
🌟 What’s New in v1.7.0? 🌟
Version 1.7.0 is packed with features that expand our app's flexibility and enhance performance. Here's what we're bringing to the table:
🏗️ Major Feature: OAuth Support in Tool Plugins
Tool plugins now support OAuth 2.0 authentication, allowing users to securely connect with third-party services without manually managing API keys. This includes refresh token support for maintaining long-term authentication sessions.
(#22550 thanks @Mairuis @zxhlyh )
🏗️ Major Feature: Plugin auto upgrade strategy
Plugins can now be automatically updated with configurable upgrade policies and rollback mechanisms. The system monitors plugin repositories and performs seamless upgrades while ensuring compatibility with your Dify version.
(#19758 thanks @RockChinQ @iamjoel )
⚡ Enhancements
- Citations and Attributions: Agent Nodes now support features for citing and attributing sources, care of @chiehw. #18558
- Plugin Deprecation Notice: Stay ahead of the curve with deprecation notices for obsolete plugins, introduced by @RockChinQ. #22685
- API Key Authentication with Query Parameter: Now supports even more streamlined security methods with an API key in query parameters, courtesy of @ACAne0320. #21656
- Audio Configuration UI: Customize your app's audio settings right from the interface, introduced by @marcelodiaz558. #21957
- Variable Suggestions: Suggested questions can now utilize variables by @le0zh. This brings contextual awareness to another level. #17340
- Drag-and-Drop for Workflows: Start node variables and code node variables are now drag-and-drop enabled, simplifying workflow creation as seen in @Minamiyama's contributions. #22150 #22127
- Custom Max Active Requests per App: Manage traffic with custom settings for your app, brought by @qiaofenlin. #22073
- Optional OpenTelemetry (OTel) Endpoint Configuration: Ensure the best observability practices with this addition from @hieheihei. #22492
- RFC 5322 Email Validation: Ensure compliance and smarter email validation by @NeatGuyCoding. #22540
- Dynamic Imports for Performance: Boost your app's performance with dynamic component imports, an intelligent improvement by @WTW0313. #22614
- External Trace ID: Maintain traceability across systems with @qiaofenlin's external trace ID propagation. #22623
🐛 Bug Fixes
- Omitting Optional Parameters: Clean out unnecessary
None
settings thanks to @ACAne0320. #22171 - Docker Networking Fix: Fix Docker file URL networking issues for plugins, resolved by @krikera. #21382
- Plugin Installation: A persistent install hitch was ironed out by @Garden12138. #22156
- Model Selector and App Selector: Problems with selectors were eliminated by @hjlarry. #22291
- Session Management: Fast and reliable infrastructure with open session management by @Colstuwjx. #22306
- Metadata and File Processing: Smarter document filtering and error handling fixed by @helojo and others. #19305
⚙️ Improvements
- User Experience: Improved Opik workflow trace span names, better tooltip UX, and character limitations handled by various contributors (@quicksandznzn, @kerwin612, and @kushagra21-afk). #22356 #21383 #22679
- Batch Processing and Vector Indexing: Strengthened backend optimizations for faster and more reliable operations from talents like @issac2e and @jubinsoni. #22726 #22661
- Repo Configurations: Configure repository implementations with ease thanks to @laipz8200's efforts. #21458
- UUIDv7 Implementation: Add unique identifiers in style with SQL and Python implementations by @QuantumGhost. #22058
Upgrade Guide
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.7.0
-
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
- fix(custom_tool): omit optional parameters instead of setting them to None by @ACAne0320 in #22171
- minor fix: remove duplicates, fix typo, and add restriction for get mcp server by @NeatGuyCoding in #22170
- feat(tool): add support for API key authentication via query parameter by @ACAne0320 in #21656
- fix: adjust layout styles for header and dataset update by @WTW0313 in #22182
- fix: resolve Docker file URL networking issue for plugins (#21334) by @krikera in #21382
- feat: Add Audio configuration setting to app configuration UI by @marcelodiaz558 in #21957
- feat: support var in suggested questions by @le0zh in #17340
- fix:Fixed the problem of plugin installation failure caused by incons… by @Garden12138 in #22156
- chore:extract last run common logic by @iamjoel in #22214
- fix(emoji-picker): Adjust the style of the emoji picker (#22161) by @HyaCiovo in #22231
- fix(web): Optimize AppInfo Component Layout (#22212) by @HyaCiovo in #22218
- feat(workflow): add drag-and-drop support for variable list items for start node by @Minamiyama in #22150
- fix: Optimize the workspace panel width calculation by @ZeroZ-lab in #22195
- fix: iteration itemType support conversation var (#22220) by @yolofit in #22236
- reject whitespace characters in password regexp by @JunIce in #22232
- test: add comprehensive unit tests for PassportService with exception handling optimization by @farion1231 in #22268
- Add unit test for account service by @NeatGuyCoding in #22278
- minor fix: wrong and by @NeatGuyCoding in #22242
- chore: bump ruff to 0.12.x by @bowenliang123 in #22259
- fix: tool's model selector and app selector not work by @hjlarry in #22291
- fix(ui): prevent var icon hidden when only one var in list of start node by @Minamiyama in #22290
- test(web): add password regexp test case by @JunIce in #22308
- fixing Enum part in backend and making it same as front end by @jubinsoni in #22296
- test: add comprehensive unit tests for login decorator by @farion1231 in #22294
- Update README.md by @kr1shnasomani in #22305
- fix: prevent trigger form submit action when press 'enter' by @douxc in #22313
- fix: error parsing object type parameters for code node by @Nov1c444 in #22230
- Chore: Replace lodash/noop with lodash-es/noop by @HyaCiovo in #22331
- Fix: Remove height and overflow style settings by @ZeroZ-lab in #22327
- feat(api/repo): Allow to config repository implementation by @laipz8200 in #21458
- fix: close session before doing long latency operation by @Colstuwjx in #22306
- Update README.md by @kr1shnasomani in #22351
- fix: aliyun trace title&description by @hieheihei in #22347
- improve opik workflow_trace span name to node name by @quicksandznzn in #22356
- Provides a set of Kubernetes manifests supporting version 1.6.0 by @Zhoneym in #22287
- chore: bump nextjs to 15.3 by @bowenliang123 in #22262
- tablestore vector support more method by @wanttobeamaster in #22225
- feat(config-modal): add space to underscore conversion in variable name input of start node by @Minamiyama in #22284
- fix(plugin): introduce response_type parameter in plugin list API to enable paginated response support by @homejim in #22251
- fix: Metadata filtering with Manual option in Agent mode does not take effect when specifying input variables. by @suntp in #20362
- fix workflow node iterator . by @zhanluxianshen in...
v1.6.0
🌟 What’s New in v1.6.0? 🌟
Welcome to version 1.6.0! 🎉🎉🎉 This release is packed with new features, crucial fixes, and various optimisations aimed at enhancing your experience. We've listened to your feedback and made significant improvements across the board.
🎯 Spotlight Feature: Introducing MCP Support! 🎯
We’re thrilled to introduce support for Anthropic’s Model Context Protocol (MCP) — a new industry standard for structuring model inputs and outputs. MCP makes it easier than ever to integrate with cutting-edge language models using a unified, reliable format.
🚀 New Features
- MCP Support: We've integrated MCP support, opening doors for more seamless interactions. (See #20716, by Novice)
⚡ Enhancements
- Drag-and-Drop for Topics: Now, you can easily reorder your topics list with a drag-and-drop sorting feature. (See #22066, by Minamiyama)
- SSL Verify Toggle: You now have the ability to change SSL verification settings in the HTTP Node. (See #22052, by Davide Delbianco)
- Batch Embedding Optimisation: Optimised batch embeddings and Qdrant write consistency. (See #21776, by luckylhb90)
- Question Classifier Enhancements: Introduced instanceId to the class-item editor for sophisticated categorisation. (See #22002, by Minamiyama)
- Redis Fallback Mechanism: Added a robust fallback mechanism for Redis to ensure data resilience. (See #21044, by NeatGuyCoding)
🐛 Fixes
- Json Output Issue: Resolved an issue with JSON output that was affecting data consistency. (See #22053, by baonudesifeizhai)
- Variable Name Uniqueness: Ensured unique variable names in the list to avoid conflicts. (See #22038, by Minamiyama)
- Overflow Hidden Fix in Drawer: Ensured that the copy button remains clickable by adding overflow hidden. (See #22103, by Heyang Wang)
- Plugin Daemon Failures: Addressed issues preventing plugin daemons from starting. (See #21841, by Kalo Chin)
Version 1.6.0 brings major process optimisations and removes previous bottlenecks, while introducing the Model Context Protocol (MCP) standard to greatly enhance the consistency and compatibility of model inputs and outputs. This makes integration and extension smoother and more efficient than ever. Huge thanks to all our contributors! We welcome your ongoing feedback to help us keep improving the platform together.
Upgrade Guide
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.6.0
-
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
- remove unused config CURRENT_VERSION by @bowenliang123 in #21832
- chore(version): Bump plugin daemon version to 0.1.3 by @laipz8200 in #21835
- Chore/workflow last run by @zxhlyh in #21823
- Fix/workflow use nodes hooks by @zxhlyh in #21822
- fix: add list contents handling in structured LLM output by @Yeuoly in #21837
- feat: Retain llm setting for agent node by @fdb02983rhy in #21842
- chore: add message status enum by @jiangbo721 in #21825
- fix: plugin deamon start fail by @fdb02983rhy in #21841
- feat(tests): add structured output parser tests for LLM responses by @Yeuoly in #21838
- fix(web): adjust HTTP node method and input layout (#21834) by @HyaCiovo in #21855
- fix: nodeExtraData might be undefined by @crazywoola in #21856
- style(config-var): update styling classes to use design system tokens by @Minamiyama in #21846
- feat(variables): auto replace spaces with underscores in variable name inputs by @Minamiyama in #21843
- fix: Before publish the app, preview the voice of tts, it raise an er… by @jiangbo721 in #21821
- feat: Improve Observability with Arize & Phoenix Integration by @ialisaleh in #19840
- moving the
MessageStatus
class from themodels.model
module tomodels.enums
module by @NeatGuyCoding in #21867 - fix: The statistics page cannot display the tokens consumed by agent node by @Nov1c444 in #21861
- feat(api): validate and reject external datasets in document update by @cutiechi in #21783
- Fix: Add title attribute to edit time text for improved accessibility by @ZeroZ-lab in #21871
- fix: not search plugin if marketplace enabled by @iamjoel in #21880
- fix: prevent timeout in file encoding detection for large files by @baonudesifeizhai in #21453
- fix: tts tool must choose a voice by @hjlarry in #21877
- fix(loop-variables): validate variable name input by @Minamiyama in #21888
- use repair_json fix json parse error of HTTPRequestNode by @ZombieBlue in #21909
- feat: add document pause and resume functionality by @ZeroZ-lab in #21894
- Feat list query by @ZeroZ-lab in #21907
- feat: update account menu style by @nite-knite in #21916
- test:add unit test for api version config by @bowenliang123 in #21919
- minor fix: removes the duplicated handling logic for TracingProviderEnum.ARIZE and TracingProviderEnum.PHOENIX from the OpsTraceProviderConfigMap by @NeatGuyCoding in #21927
- refactor(web): Restructure the operation buttons layout in the app information component (#21742) by @HyaCiovo in #21818
- feat: Add Aliyun LLM Observability Integration by @hieheihei in #21471
- minor fix: translation for pause by @NeatGuyCoding in #21949
- chore(i18n): fix typos and improve Korean translation by @heojawon in #21955
- refactor: extract common url validator for config_entity.py by @NeatGuyCoding in #21934
- fix(agent): show agent run steps, fixes #21718 by @baonudesifeizhai in #21945
- fix: resolve JSON.parse precision issue causing 'list index out of ra… by @baonudesifeizhai in #21253
- feat: Add support for type="hidden" input elements in Markdown forms by @mizoo-snow21 in #21922
- refactor(graph_engine): Take GraphRuntimeState out of GraphEngine by @laipz8200 in #21882
- ENH(ui): enhance check list by @Minamiyama in #21932
- chore(docker): increase NGINX_CLIENT_MAX_BODY_SIZE from 15M to 100M i… by @lrhan321 in #21995
- fix: document delete image files check file exist by @quicksandznzn in #21991
- Chore: remove unreachable code by @hyongtao-db in #21986
- fix: resolve dropdown menu visibility issue caused by z-index conflict by @GeZiMm in #22000
- minro fix: fix a typo for aliyun by @NeatGuyCoding in #22001
- feat: add unit tests and validation for aliyun tracing by @NeatGuyCoding in #22012
- fix(variables): Improve
getNodeUsedVars
implementation details by @Minamiyama in #21987 - minro fix: fix duplicate local import of ToolProviderType by @NeatGuyCoding in #22013
- test: add unit tests for password validation and hashing by @farion1231 in #22003
- feat(question-classifier): add instanceId to class-item editor by @Minamiyama in #22002
- don't add search params when opening detail links from marketplace. by @douxc in #22034
- fix(variable): ensure unique variable names in var-list by @Minamiyama in htt...