fix(workflow): prevent fixed speech continuation

This commit is contained in:
Xin Wang
2026-08-03 13:02:31 +08:00
parent 4c43e167db
commit ef434c80b2
3 changed files with 63 additions and 16 deletions

View File

@@ -30,6 +30,7 @@ from services.brains.dify_llm import (
normalize_api_base,
)
from services.brains.workflow_brain import ConfiguredFlowManager, WorkflowBrain
from services.fixed_speech import FIXED_SPEECH_CONTEXT_MARKER
from services.runtime_variables import prepare_dynamic_config
from services.action_runtime import ActionOutcome, ActionStatus
from services.workflow.models import (
@@ -1723,7 +1724,10 @@ class WorkflowBrainTests(unittest.IsolatedAsyncioTestCase):
{
"id": "agent1",
"type": "agent",
"data": {"prompt": "收集基本信息"},
"data": {
"prompt": "收集基本信息",
"entryMode": "generate",
},
},
{
"id": "middle",
@@ -1846,6 +1850,21 @@ class WorkflowBrainTests(unittest.IsolatedAsyncioTestCase):
if manager.current_node == "agent1":
break
self.assertEqual(manager.current_node, "agent1")
self.assertEqual(
manager.configs[-1]["task_messages"],
[
{
"role": "system",
"content": f"{FIXED_SPEECH_CONTEXT_MARKER}\n欢迎使用。",
}
],
)
self.assertFalse(
any(
message["role"] == "assistant"
for message in manager.configs[-1]["task_messages"]
)
)
# The user-turn processor must return while the second Message is
# still waiting for its transport playback boundary.
@@ -1868,8 +1887,13 @@ class WorkflowBrainTests(unittest.IsolatedAsyncioTestCase):
self.assertEqual(
manager.configs[-1]["task_messages"],
[
{
"role": "system",
"content": (
f"{FIXED_SPEECH_CONTEXT_MARKER}\n现在进入信息确认。"
),
},
{"role": "user", "content": "基本信息已经收集完成"},
{"role": "assistant", "content": "现在进入信息确认。"},
],
)
@@ -2550,7 +2574,14 @@ class WorkflowBrainTests(unittest.IsolatedAsyncioTestCase):
for frame in worker.frames
if isinstance(frame, LLMMessagesAppendFrame)
and frame.messages
== [{"role": "assistant", "content": "正在为你结束流程"}]
== [
{
"role": "system",
"content": (
f"{FIXED_SPEECH_CONTEXT_MARKER}\n正在为你结束流程"
),
}
]
]
self.assertTrue(transition_context_frames)
transition_events = [