mirror of
https://github.com/langgenius/dify.git
synced 2026-04-30 23:48:04 +08:00
feat(api): publish a message_replace event with saved temporary answer
This ensures that the message content in frontend UI is properly restored.
This commit is contained in:
@ -14,6 +14,7 @@ from sqlalchemy.orm import Session, sessionmaker
|
||||
|
||||
from core.app.apps.message_generator import MessageGenerator
|
||||
from core.app.entities.task_entities import (
|
||||
MessageReplaceStreamResponse,
|
||||
NodeFinishStreamResponse,
|
||||
NodeStartStreamResponse,
|
||||
StreamEvent,
|
||||
@ -39,6 +40,7 @@ class MessageContext:
|
||||
conversation_id: str
|
||||
message_id: str
|
||||
created_at: int
|
||||
answer: str | None = None
|
||||
|
||||
|
||||
@dataclass
|
||||
@ -157,6 +159,7 @@ def _get_message_context(session_maker: sessionmaker[Session], workflow_run_id:
|
||||
conversation_id=message.conversation_id,
|
||||
message_id=message.id,
|
||||
created_at=created_at,
|
||||
answer=message.answer,
|
||||
)
|
||||
|
||||
|
||||
@ -208,6 +211,11 @@ def _build_snapshot_events(
|
||||
_apply_message_context(workflow_started, message_context)
|
||||
events.append(workflow_started)
|
||||
|
||||
if message_context is not None and message_context.answer is not None:
|
||||
message_replace = _build_message_replace_event(task_id=task_id, answer=message_context.answer)
|
||||
_apply_message_context(message_replace, message_context)
|
||||
events.append(message_replace)
|
||||
|
||||
for snapshot in node_snapshots:
|
||||
node_started = _build_node_started_event(
|
||||
workflow_run_id=workflow_run.id,
|
||||
@ -261,6 +269,17 @@ def _build_workflow_started_event(
|
||||
return payload
|
||||
|
||||
|
||||
def _build_message_replace_event(*, task_id: str, answer: str) -> dict[str, Any]:
|
||||
response = MessageReplaceStreamResponse(
|
||||
task_id=task_id,
|
||||
answer=answer,
|
||||
reason="",
|
||||
)
|
||||
payload = response.model_dump(mode="json")
|
||||
payload["event"] = response.event.value
|
||||
return payload
|
||||
|
||||
|
||||
def _build_node_started_event(
|
||||
*,
|
||||
workflow_run_id: str,
|
||||
|
||||
@ -175,6 +175,7 @@ def test_build_snapshot_events_applies_message_context() -> None:
|
||||
conversation_id="conv-1",
|
||||
message_id="msg-1",
|
||||
created_at=1700000000,
|
||||
answer="snapshot message",
|
||||
)
|
||||
|
||||
events = _build_snapshot_events(
|
||||
@ -186,6 +187,13 @@ def test_build_snapshot_events_applies_message_context() -> None:
|
||||
resumption_context=None,
|
||||
)
|
||||
|
||||
assert [event["event"] for event in events] == [
|
||||
"workflow_started",
|
||||
"message_replace",
|
||||
"node_started",
|
||||
"node_finished",
|
||||
]
|
||||
assert events[1]["answer"] == "snapshot message"
|
||||
for event in events:
|
||||
assert event["conversation_id"] == "conv-1"
|
||||
assert event["message_id"] == "msg-1"
|
||||
|
||||
Reference in New Issue
Block a user