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
d3d9f21cdf
feat(api): wire sandbox into Agent V2 node execution pipeline
...
Integrate the ported sandbox system with Agent V2 node:
- Add DIFY_SANDBOX_CONTEXT_KEY to app_invoke_entities for passing
sandbox through run_context without modifying graphon
- DifyNodeFactory._resolve_sandbox() extracts sandbox from run_context
and passes it to AgentV2Node constructor
- AgentV2Node accepts optional sandbox parameter
- AgentV2ToolManager supports dual execution paths:
- _invoke_tool_directly(): standard ToolEngine.generic_invoke (no sandbox)
- _invoke_tool_in_sandbox(): delegates to SandboxBashSession.run_tool()
which uses DifyCli to call back to Dify API from inside the sandbox
- Graceful fallback: if sandbox execution fails, logs warning and returns
error message (does not crash the agent loop)
To enable sandbox for an Agent workflow:
1. Create a Sandbox via SandboxBuilder
2. Add it to run_context under DIFY_SANDBOX_CONTEXT_KEY
3. Agent V2 nodes will automatically use sandbox for tool execution
46 existing tests still pass.
Made-with: Cursor
2026-04-08 17:46:34 +08:00
Yansong Zhang
0c7e7e0c4e
feat(api): port Sandbox + VirtualEnvironment + Skill system from feat/support-agent-sandbox (Phase 5-6)
...
Port the complete infrastructure for agent sandbox execution and skill system:
Sandbox & Virtual Environment (core/sandbox/, core/virtual_environment/):
- Sandbox entity with lifecycle management (ready/failed/cancelled states)
- SandboxBuilder with fluent API for configuring providers
- 5 VM providers: Local, SSH, Docker, E2B, AWS CodeInterpreter
- VirtualEnvironment base with command execution, file transfer, transport layers
- Channel transport: pipe, queue, socket implementations
- Bash session management and DifyCli binary integration
- Storage: archive storage, file storage, noop storage, presign storage
- Initializers: DifyCli, AppAssets, DraftAppAssets, Skills
- Inspector: file browser, archive/runtime source, script utils
- Security: encryption utils, debug helpers
Skill & App Assets (core/skill/, core/app_assets/, core/app_bundle/):
- Skill entity and manager
- App asset accessor, builder pipeline (file, skill builders)
- App bundle source zip extractor
- Storage and converter utilities
API Endpoints:
- CLI API blueprint (controllers/cli_api/) for sandbox callback
- Sandbox provider management (workspace/sandbox_providers)
- Sandbox file browser (console/sandbox_files)
- App asset management (console/app/app_asset)
- Skill management (console/app/skills)
- Storage file endpoints (controllers/files/storage_files)
Services:
- Sandbox service, provider service, file service
- App asset service, app bundle service
Config:
- CliApiConfig, CreatorsPlatformConfig, CollaborationConfig
- FILES_API_URL for sandbox file access
Note: Controller route registration temporarily commented out (marked TODO)
pending resolution of deep dependency chains (socketio, workflow_comment,
command node, etc.). Core sandbox modules are fully ported and syntax-validated.
110 files changed, 10,549 insertions.
Made-with: Cursor
2026-04-08 17:39:02 +08:00
Yansong Zhang
d9d1e9b63a
fix(api): resolve Agent V2 node E2E runtime issues
...
Fixes discovered during end-to-end testing of Agent workflow execution:
1. ModelManager instantiation: use ModelManager.for_tenant() instead of
ModelManager() which requires a ProviderManager argument
2. Variable template resolution: use VariableTemplateParser(template).format()
instead of non-existent resolve_template() static method
3. invoke_llm() signature: remove unsupported 'user' keyword argument
4. Event dispatch: remove ModelInvokeCompletedEvent from _run() yield
(graphon base Node._dispatch doesn't support it via singledispatch)
5. NodeRunResult metadata: use WorkflowNodeExecutionMetadataKey enum keys
(TOTAL_TOKENS, TOTAL_PRICE, CURRENCY) instead of arbitrary string keys
6. SSE topic mismatch: use AppMode.AGENT (not ADVANCED_CHAT) in
retrieve_events() so publisher and subscriber share the same channel
7. Celery task routing: add AppMode.AGENT to workflow_execute_task._run_app()
alongside ADVANCED_CHAT
All issues verified fixed: Agent V2 node successfully invokes LLM and
returns "Hello there!" through the full SSE streaming pipeline.
Made-with: Cursor
2026-04-08 16:21:12 +08:00
Yansong Zhang
bebafaa346
fix(api): allow AGENT mode in console chat, message, and debug endpoints
...
Add AppMode.AGENT to mode checks discovered during E2E testing:
- Console chat-messages endpoint (ChatApi)
- Console chat stop endpoint (ChatMessageStopApi)
- Console message list and detail endpoints
- Advanced-chat debug run endpoints (5 in workflow.py)
- Advanced-chat workflow run endpoints (2 in workflow_run.py)
Made-with: Cursor
2026-04-08 13:27:42 +08:00
Yansong Zhang
1835a1dc5d
fix(api): allow AGENT mode in workflow features validation
...
Add AppMode.AGENT to validate_features_structure() match case
alongside ADVANCED_CHAT, fixing 'Invalid app mode: agent' error
when creating Agent apps (which auto-generate a workflow draft).
Discovered during E2E testing of the full create -> draft -> publish flow.
Made-with: Cursor
2026-04-08 13:19:59 +08:00
Yansong Zhang
8f3a3ea03e
feat(api): enable Agent mode in workflow/service APIs and add default config (Phase 7)
...
Ensure new Agent apps (AppMode.AGENT) can access all workflow-related
APIs and Service API chat endpoints:
- Add AppMode.AGENT to 13 workflow controller mode checks
- Add AppMode.AGENT to 4 workflow_run controller mode checks
- Add AppMode.AGENT to workflow_draft_variable controller
- Add AppMode.AGENT to Service API chat, conversation, message endpoints
- Add AgentV2Node.get_default_config() with prompt templates and strategy defaults
- 46 unit tests all passing (8 new Phase 7 tests)
Old agent/agent-chat paths remain completely unchanged.
Made-with: Cursor
2026-04-08 12:41:37 +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
corevibe555
b1adb5652e
refactor(api): deduplicate I18nObject in datasource entities ( #34701 )
2026-04-08 01:36:56 +00:00
corevibe555
c825d5dcf6
refactor(api): tighten types for Tenant.custom_config_dict and MCPToolProvider.headers ( #34698 )
2026-04-08 01:36:42 +00:00
Renzo
2127d5850f
refactor: replace untyped dicts with TypedDict in VDB config classes ( #34697 )
2026-04-08 00:57:11 +00:00
carlos4s
ae9fcc2969
refactor: use sessionmaker in controllers, events, models, and tasks 1 ( #34693 )
2026-04-07 23:47:20 +00:00
corevibe555
624db69f12
refactor(api): remove duplicated RAG entities from services layer ( #34689 )
2026-04-07 23:36:59 +00:00
corevibe555
80a7843f45
refactor(api): migrate consumers to shared RAG domain entities from core/rag/entities/ ( #34692 )
2026-04-07 23:22:56 +00:00
Renzo
cb55176612
refactor: migrate session.query to select API in small task files batch ( #34684 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-04-07 22:58:23 +00:00
Statxc
5aa2524d33
refactor(api): type I18nObject.to_dict with I18nObjectDict TypedDict ( #34680 )
2026-04-07 22:57:32 +00:00
Pulakesh
2575a3a3ab
refactor(api): clean up AssistantPromptMessage typing in CotChatAgentRunner ( #34681 )
2026-04-07 22:53:14 +00:00
corevibe555
f8f7b0ec1a
refactor(api): deduplicate shared auth request payloads into auth_entities.py ( #34694 )
2026-04-07 22:51:11 +00:00
corevibe555
d2ee486900
refactor(api): extract shared RAG domain entities into core/rag/entity ( #34685 )
2026-04-07 22:43:37 +00:00
Statxc
c44ddd9831
refactor(api): type Chroma and AnalyticDB config params dicts with TypedDicts ( #34678 )
2026-04-07 13:27:12 +00:00
Statxc
e645cbd8f8
refactor(api): type VDB config params dicts with TypedDicts ( #34677 )
2026-04-07 13:23:42 +00:00
YBoy
485fc2c416
refactor(api): type Tenant custom config with TypedDict and tighten MCP headers type ( #34670 )
2026-04-07 13:18:19 +00:00
YBoy
f09be969bb
refactor(api): type single-node graph structure with TypedDicts in workflow_entry ( #34671 )
2026-04-07 13:18:00 +00:00
Statxc
597a0b4d9f
refactor(api): type indexing result with IndexingResultDict TypedDict ( #34672 )
2026-04-07 13:17:39 +00:00
Statxc
779cce3c61
refactor(api): type gen_index_struct_dict with VectorIndexStructDict TypedDict ( #34675 )
2026-04-07 13:17:20 +00:00
Statxc
b5d9a71cf9
refactor(api): type VDB to_index_struct with VectorIndexStructDict TypedDict ( #34674 )
2026-04-07 13:17:04 +00:00
corevibe555
c2af415450
refactor(api): Extract shared ResponseModel ( #34633 )
2026-04-07 13:05:38 +00:00
Dream
89ce61cfea
refactor(api): replace json.loads with Pydantic validation in security and tools layers ( #34380 )
2026-04-07 12:11:51 +00:00
yyh
05c5327f47
chore: remove unused pnpm overrides ( #34658 )
2026-04-07 09:36:49 +00:00
yyh
3891c0a255
fix(workflow): correct env variable picker validation ( #34666 )
2026-04-07 09:34:25 +00:00
非法操作
63b1d0c1ea
fix: var input label missing icon ( #34569 )
2026-04-07 09:33:13 +00:00
Pulakesh
75ed38fb3d
fix( #34636 ): replace SimpleNamespace with MagicMock(spec=App) in test_app_dsl_service ( #34659 )
2026-04-07 07:25:46 +00:00
Statxc
63db9a7a2f
refactor(api): type load balancing config dicts with TypedDict ( #34639 )
2026-04-07 05:58:10 +00:00
Statxc
19c80f0f0e
refactor(api): type error stream response with TypedDict ( #34641 )
2026-04-07 05:57:42 +00:00
YBoy
c5a0bde3ec
refactor(api): type aliyun trace utils with TypedDict and tighten return types ( #34642 )
2026-04-07 05:57:22 +00:00
YBoy
1261e5e5e8
refactor(api): type webhook validation result and workflow inputs with TypedDict ( #34645 )
2026-04-07 05:57:02 +00:00
Renzo
e2ecd68556
refactor: migrate session.query to select API in rag pipeline task files ( #34648 )
2026-04-07 05:56:19 +00:00
Pulakesh
bceb0eee9b
refactor(api): migrate dict returns to TypedDicts in billing service ( #34649 )
2026-04-07 05:56:02 +00:00
Renzo
173e818a62
refactor: migrate session.query to select API in summary and remove document tasks ( #34650 )
2026-04-07 05:55:31 +00:00
YBoy
84d8940dbf
refactor(api): type app parameter feature toggles with FeatureToggleD… ( #34651 )
2026-04-07 05:53:50 +00:00
Renzo
3e995e6a6d
refactor: migrate session.query to select API in document task files ( #34646 )
2026-04-07 05:53:21 +00:00
yyh
459c36f21b
fix: improve app delete alert dialog UX ( #34644 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-04-07 05:03:39 +00:00
Renzo
72adb5468c
refactor: migrate session.query to select API in retrieval_service ( #34638 )
2026-04-07 04:46:30 +00:00
Renzo
1194957fde
refactor: migrate session.query to select API in end_user_service and small tasks ( #34620 )
2026-04-07 04:25:55 +00:00
Renzo
68bd29eda2
refactor: migrate session.query to select API in sync task and services ( #34619 )
2026-04-07 04:23:14 +00:00
YBoy
f67a811f7f
refactor: replace dict params with BaseModel payloads in TagService ( #34422 )
...
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-04-07 04:20:02 +00:00
yyh
b9c122e7f4
fix: simplify pre-commit hook flow ( #34637 )
2026-04-07 04:19:31 +00:00
aliworksx08
396b39dff9
refactor: migrate session.query to select API in console controllers ( #34607 )
2026-04-07 04:19:30 +00:00
Renzo
ac8bd12609
refactor: migrate session.query to select API in small task files ( #34617 )
2026-04-07 04:13:22 +00:00
Renzo
b55bef4438
refactor: migrate session.query to select API in core misc modules ( #34608 )
2026-04-07 04:08:34 +00:00