Yansong Zhang
77c182f738
feat(api): propagate all app features in transparent upgrade
...
VirtualWorkflowSynthesizer._build_features() now extracts ALL legacy
app features from AppModelConfig into the synthesized workflow.features:
- opening_statement + suggested_questions
- sensitive_word_avoidance (keywords/API moderation)
- more_like_this
- speech_to_text / text_to_speech
- retriever_resource
Previously workflow.features was hardcoded to "{}", losing all these
features during transparent upgrade. Now AdvancedChatAppRunner's
moderation, opening text, and other feature layers work correctly
for transparently upgraded old apps.
Made-with: Cursor
2026-04-10 18:47:18 +08:00
Yansong Zhang
7052257c8d
fix(api): use lazy workflow persistence for transparent upgrade of old apps
...
VirtualWorkflowSynthesizer.ensure_workflow() creates a real draft
workflow on first call for a legacy app, persisting it to the database.
On subsequent calls, returns the existing draft.
This is needed because AdvancedChatAppGenerator's worker thread looks
up workflows from the database by ID. Instead of hacking the generator
to skip DB lookups, we treat this as a lazy one-time upgrade: the old
app gets a real workflow that can also be edited in the workflow editor.
Verified: old chat app created on main branch ("What is 2+2?" -> "Four")
and old agent-chat app ("Say hello" -> "Hello!") both successfully
execute through the Agent V2 engine with AGENT_V2_TRANSPARENT_UPGRADE=true.
Made-with: Cursor
2026-04-09 11:28:16 +08:00
Yansong Zhang
66212e3575
feat(api): implement zero-migration transparent upgrade (Phase 8)
...
Add two feature-flag-controlled upgrade paths that allow existing apps
and LLM nodes to transparently run through the Agent V2 engine without
any database migration:
1. AGENT_V2_TRANSPARENT_UPGRADE (default: off):
When enabled, old apps (chat/completion/agent-chat) bypass legacy
Easy-UI runners. VirtualWorkflowSynthesizer converts AppModelConfig
to an in-memory Workflow (start -> agent-v2 -> answer) at runtime,
then executes via AdvancedChatAppGenerator. Falls back to legacy
path on any synthesis error.
VirtualWorkflowSynthesizer maps:
- model JSON -> ModelConfig
- pre_prompt/chat_prompt_config -> prompt_template
- agent_mode.tools -> ToolMetadata[]
- agent_mode.strategy -> agent_strategy
- dataset_configs -> context
- file_upload -> vision
2. AGENT_V2_REPLACES_LLM (default: off):
When enabled, DifyNodeFactory.create_node() transparently remaps
nodes with type="llm" to type="agent-v2" before class resolution.
Since AgentV2NodeData is a strict superset of LLMNodeData, the
mapping is lossless. With tools=[], Agent V2 behaves identically
to LLM Node.
Both flags default to False for safety. Turn off = instant rollback.
46 existing tests pass. Flask starts successfully.
Made-with: Cursor
2026-04-09 10:30:52 +08:00
Yansong Zhang
44491e427c
feat(api): enable all sandbox/skill controller routes and resolve dependencies (P0)
...
Resolve the full dependency chain to enable all previously disabled controllers:
Enabled routes:
- sandbox_files: sandbox file browser API
- sandbox_providers: sandbox provider management API
- app_asset: app asset management API
- skills: skill extraction API
- CLI API blueprint: DifyCli callback endpoints (/cli/api/*)
Dependencies extracted (64 files, ~8000 lines):
- models/sandbox.py, models/app_asset.py: DB models
- core/zip_sandbox/: zip-based sandbox execution
- core/session/: CLI API session management
- core/memory/: base memory + node token buffer
- core/helper/creators.py: helper utilities
- core/llm_generator/: context models, output models, utils
- core/workflow/nodes/command/: command node type
- core/workflow/nodes/file_upload/: file upload node type
- core/app/entities/: app_asset_entities, app_bundle_entities, llm_generation_entities
- services/: asset_content, skill, workflow_collaboration, workflow_comment
- controllers/console/app/error.py: AppAsset error classes
- core/tools/utils/system_encryption.py
Import fixes:
- dify_graph.enums -> graphon.enums in skill_service.py
- get_signed_file_url_for_plugin -> get_signed_file_url in cli_api.py
All 5 controllers verified: import OK, Flask starts successfully.
46 existing tests still pass.
Made-with: Cursor
2026-04-09 09:36:16 +08:00
Yansong Zhang
96641a93f6
feat(api): add Agent V2 node and new Agent app type (Phase 1-3)
...
Introduce a new unified Agent V2 workflow node that combines LLM capabilities
with agent tool-calling loops, along with a new AppMode.AGENT for standalone
agent apps backed by single-node workflows.
Phase 1 — Agent Patterns:
- Add core/agent/patterns/ module (AgentPattern, FunctionCallStrategy,
ReActStrategy, StrategyFactory) ported from feat/support-agent-sandbox
- Add ExecutionContext, AgentLog, AgentResult entities
- Add Tool.to_prompt_message_tool() for LLM-consumable tool conversion
Phase 2 — Agent V2 Workflow Node:
- Add core/workflow/nodes/agent_v2/ (AgentV2Node, AgentV2NodeData,
AgentV2ToolManager, AgentV2EventAdapter)
- Register agent-v2 node type in DifyNodeFactory
- No-tools path: single LLM call (LLM Node equivalent)
- Tools path: FC/ReAct loop via StrategyFactory
Phase 3 — Agent App Type:
- Add AppMode.AGENT to model enum
- Add WorkflowGraphFactory for auto-generating start->agent_v2->answer graphs
- AppService.create_app() creates workflow draft for AGENT mode
- AppGenerateService.generate() routes AGENT to AdvancedChatAppGenerator
- Console API and DSL import/export support AGENT mode
- Default app template for AGENT mode
Old agent/agent-chat/LLM node paths are fully preserved.
38 unit tests all passing.
Made-with: Cursor
2026-04-08 12:31:23 +08:00
5ad8c3e249
refactor: convert AppMode if/elif to match/case in service files ( #30001 ) ( #34562 )
...
Co-authored-by: agenthaulk <[email protected] >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-04-05 10:22:11 +00:00
8f9dbf269e
chore(api): align Python support with 3.12 ( #34419 )
...
Co-authored-by: Asuka Minato <[email protected] >
2026-04-02 05:07:32 +00:00
beda78e911
refactor: select in 13 small service files ( #34371 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-04-01 04:00:05 +00:00
40591a7c50
refactor(api): use standalone graphon package ( #34209 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-03-27 21:05:32 +00:00
99 and GitHub
52e7492cbc
refactor(api): rename dify_graph to graphon ( #34095 )
2026-03-25 21:58:56 +08:00
BitToby and GitHub
3d5a29462e
refactor(api): type workflow service dicts with TypedDict ( #33829 )
2026-03-20 22:36:31 +09:00
-LAN- and GitHub
fb41b215c8
refactor(api): move workflow knowledge nodes and trigger nodes ( #33445 )
2026-03-15 15:24:59 +08:00
e64f4d6039
refactor: replace sa.String with EnumText in mapped_column for type s… ( #33332 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <[email protected] >
2026-03-14 13:38:27 +09:00
-LAN- and GitHub
4fd6b52808
refactor(api): move model_runtime into dify_graph ( #32858 )
2026-03-02 20:15:32 +08:00
-LAN- and GitHub
c917838f9c
refactor: move workflow package to dify_graph ( #32844 )
2026-03-02 18:42:30 +08:00
99 and GitHub
a01de98721
refactor(workflow): decouple start node external dependencies ( #32793 )
2026-03-02 02:01:41 +08:00
7656d514b9
refactor(workflow-file): move core.file to core.workflow.file ( #32252 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-02-16 22:38:19 +08:00
a1fc280102
feat: Human Input Node ( #32060 )
...
The frontend and backend implementation for the human input node.
Co-authored-by: twwu <[email protected] >
Co-authored-by: JzoNg <[email protected] >
Co-authored-by: yyh <[email protected] >
Co-authored-by: zhsama <[email protected] >
2026-02-09 14:57:23 +08:00
90fe9abab7
revert: revert human input relevant code ( #31766 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-01-30 19:18:49 +08:00
03e3acfc71
feat(api): Human Input Node (backend part) ( #31646 )
...
The backend part of the human in the loop (HITL) feature and relevant architecture / workflow engine changes.
Signed-off-by: yihong0618 <[email protected] >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: -LAN- <[email protected] >
Co-authored-by: 盐粒 Yanli <[email protected] >
Co-authored-by: CrabSAMA <[email protected] >
Co-authored-by: Stephen Zhou <[email protected] >
Co-authored-by: Copilot <[email protected] >
Co-authored-by: yihong <[email protected] >
Co-authored-by: Joel <[email protected] >
2026-01-30 10:18:49 +08:00
a1b735a4c0
feat: trigger billing ( #28335 )
...
Signed-off-by: lyzno1 <[email protected] >
Co-authored-by: lyzno1 <[email protected] >
Co-authored-by: lyzno1 <[email protected] >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-11-20 10:15:23 +08:00
d1580791e4
TypedBase + TypedDict ( #28137 )
...
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Copilot <[email protected] >
2025-11-13 20:18:51 +08:00
+4
b76e17b25d
feat: introduce trigger functionality ( #27644 )
...
Signed-off-by: lyzno1 <[email protected] >
Co-authored-by: Stream <[email protected] >
Co-authored-by: lyzno1 <[email protected] >
Co-authored-by: zhsama <[email protected] >
Co-authored-by: Harry <[email protected] >
Co-authored-by: lyzno1 <[email protected] >
Co-authored-by: yessenia <[email protected] >
Co-authored-by: hjlarry <[email protected] >
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: WTW0313 <[email protected] >
Co-authored-by: Copilot <[email protected] >
2025-11-12 17:59:37 +08:00
cced33d068
use deco to avoid current_user ( #26077 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-10-16 15:45:51 +09:00
1bd621f819
remove .value ( #26633 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-10-11 09:08:29 +08:00
yihong and GitHub
bbbb6e04cb
fix: delete useless db session commit ( #26572 )
...
Signed-off-by: yihong0618 <[email protected] >
2025-10-05 12:43:40 +08:00
+10
85cda47c70
feat: knowledge pipeline ( #25360 )
...
Signed-off-by: -LAN- <[email protected] >
Co-authored-by: twwu <[email protected] >
Co-authored-by: crazywoola <[email protected] >
Co-authored-by: jyong <[email protected] >
Co-authored-by: Wu Tianwei <[email protected] >
Co-authored-by: QuantumGhost <[email protected] >
Co-authored-by: lyzno1 <[email protected] >
Co-authored-by: quicksand <[email protected] >
Co-authored-by: Jyong <[email protected] >
Co-authored-by: lyzno1 <[email protected] >
Co-authored-by: zxhlyh <[email protected] >
Co-authored-by: Yongtao Huang <[email protected] >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Joel <[email protected] >
Co-authored-by: Copilot <[email protected] >
Co-authored-by: nite-knite <[email protected] >
Co-authored-by: Hanqing Zhao <[email protected] >
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Harry <[email protected] >
2025-09-18 12:49:10 +08:00
bab4975809
chore: add ast-grep rule to convert Optional[T] to T | None ( #25560 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-15 13:06:33 +08:00
a13d7987e0
chore: adopt StrEnum and auto() for some string-typed enums ( #25129 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: crazywoola <[email protected] >
2025-09-12 21:14:26 +08:00
08dd3f7b50
Fix basedpyright type errors ( #25435 )
...
Signed-off-by: -LAN- <[email protected] >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-09-10 01:54:26 +08:00
a78339a040
remove bare list, dict, Sequence, None, Any ( #25058 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: -LAN- <[email protected] >
2025-09-06 03:32:23 +08:00
willzhao and GitHub
5ab6bc283c
[CHORE]: x: T = None to x: Optional[T] = None ( #24217 )
2025-08-21 21:58:39 +08:00
ab163a5f75
Chore: use Workflow.VERSION_DRAFT instead of hardcoded draft ( #23136 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-07-30 10:34:51 +08:00
ef51678c73
orm filter -> where ( #22801 )
...
Signed-off-by: -LAN- <[email protected] >
Co-authored-by: -LAN- <[email protected] >
Co-authored-by: Claude <[email protected] >
2025-07-24 00:57:45 +08:00
yihong and GitHub
56e15d09a9
feat: mypy for all type check ( #10921 )
2024-12-24 18:38:51 +08:00
-LAN- and GitHub
25ca0278dd
refactor(core): Remove extra_config from File. ( #10203 )
2024-11-08 18:13:24 +08:00
-LAN- and GitHub
e61752bd3a
feat/enhance the multi-modal support ( #8818 )
2024-10-21 10:43:49 +08:00
Bowen Liang and GitHub
40fb4d16ef
chore: refurbish Python code by applying refurb linter rules ( #8296 )
2024-09-12 15:50:49 +08:00
kurokobo and GitHub
bc3a8e0ca2
feat: store created_by and updated_by for apps, modelconfigs, and sites ( #7613 )
2024-08-28 08:47:30 +08:00
-LAN- and GitHub
5e42e90abc
fix(api/services/workflow/workflow_converter.py): Add NoneType checkers & format file. ( #7446 )
2024-08-20 17:51:49 +08:00
fbf31b5d52
feat: custom app icon ( #7196 )
...
Co-authored-by: crazywoola <[email protected] >
2024-08-19 09:16:33 +08:00
-LAN- and GitHub
5350b1d938
fix(api/services/workflow/workflow_converter.py): Add converrsation variable to workflow. ( #7257 )
2024-08-17 10:30:12 +08:00
Nam Vu and GitHub
dbc1ae45de
chore: update docstrings ( #7343 )
2024-08-16 14:19:01 +08:00
935e72d449
Feat: conversation variable & variable assigner node ( #7222 )
...
Signed-off-by: -LAN- <[email protected] >
Co-authored-by: Joel <[email protected] >
Co-authored-by: -LAN- <[email protected] >
2024-08-13 14:44:10 +08:00
5e6fc58db3
Feat/environment variables in workflow ( #6515 )
...
Co-authored-by: JzoNg <[email protected] >
2024-07-22 15:29:39 +08:00
dcb72e0067
chore: apply flake8-comprehensions Ruff rules to improve collection comprehensions ( #5652 )
...
Co-authored-by: -LAN- <[email protected] >
2024-06-27 11:21:31 +08:00
Bowen Liang and GitHub
b234710af9
chore: fix invalid escape sequences by applying W605 rule ( #4851 )
2024-06-02 10:02:37 +08:00
7753ba2d37
FEAT: NEW WORKFLOW ENGINE ( #3160 )
...
Co-authored-by: Joel <[email protected] >
Co-authored-by: Yeuoly <[email protected] >
Co-authored-by: JzoNg <[email protected] >
Co-authored-by: StyleZhang <[email protected] >
Co-authored-by: jyong <[email protected] >
Co-authored-by: nite-knite <[email protected] >
Co-authored-by: jyong <[email protected] >
2024-04-08 18:51:46 +08:00