dify/api/core/workflow
Yansong Zhang b21a443d56 fix(api): resolve all remaining known issues
1. Fix workflow-level total_tokens=0:
   Call graph_runtime_state.add_tokens(usage.total_tokens) in both
   _run_without_tools and _run_with_tools paths after node execution.
   Previously only graphon's internal ModelInvokeCompletedEvent handler
   called add_tokens, which agent-v2 doesn't emit.

2. Fix Turn 2 SSE empty response:
   Set PUBSUB_REDIS_CHANNEL_TYPE=streams in .env. Redis Streams
   provides durable event delivery (consumers can replay past events),
   solving the pub/sub at-most-once timing issue.

3. Skill -> Agent runtime integration:
   SandboxBuilder.build() now auto-includes SkillInitializer if not
   already present. This ensures sandbox.attrs has the skill bundle
   loaded for downstream consumers (tool execution in sandbox).

4. LegacyResponseAdapter:
   New module at core/app/apps/common/legacy_response_adapter.py.
   Filters workflow-specific SSE events (workflow_started, node_started,
   node_finished, workflow_finished) from the stream, passing through
   only message/message_end/agent_log/error/ping events that old
   clients expect.

46 unit tests pass.

Made-with: Cursor
2026-04-09 12:53:11 +08:00
..
nodes fix(api): resolve all remaining known issues 2026-04-09 12:53:11 +08:00
__init__.py refactor(api): move workflow knowledge nodes and trigger nodes (#33445) 2026-03-15 15:24:59 +08:00
file_reference.py refactor(api): continue decoupling dify_graph from API concerns (#33580) 2026-03-25 20:32:24 +08:00
human_input_compat.py refactor(api): use standalone graphon package (#34209) 2026-03-27 21:05:32 +00:00
human_input_forms.py refactor(api): continue decoupling dify_graph from API concerns (#33580) 2026-03-25 20:32:24 +08:00
node_factory.py feat(api): implement zero-migration transparent upgrade (Phase 8) 2026-04-09 10:30:52 +08:00
node_runtime.py refactor(api): use standalone graphon package (#34209) 2026-03-27 21:05:32 +00:00
system_variables.py refactor(api): rename dify_graph to graphon (#34095) 2026-03-25 21:58:56 +08:00
template_rendering.py refactor(api): use standalone graphon package (#34209) 2026-03-27 21:05:32 +00:00
variable_pool_initializer.py refactor(api): rename dify_graph to graphon (#34095) 2026-03-25 21:58:56 +08:00
variable_prefixes.py refactor(api): continue decoupling dify_graph from API concerns (#33580) 2026-03-25 20:32:24 +08:00
workflow_entry.py refactor(api): type single-node graph structure with TypedDicts in workflow_entry (#34671) 2026-04-07 13:18:00 +00:00
workflow_run_outputs.py refactor(api): rename dify_graph to graphon (#34095) 2026-03-25 21:58:56 +08:00