| from collections.abc import Mapping, Sequence | |
| from enum import Enum | |
| from typing import Any, Optional | |
| from pydantic import BaseModel, ConfigDict | |
| from core.model_runtime.entities.llm_entities import LLMResult | |
| from core.model_runtime.utils.encoders import jsonable_encoder | |
| from models.workflow import WorkflowNodeExecutionStatus | |
| class TaskState(BaseModel): | |
| """ | |
| TaskState entity | |
| """ | |
| metadata: dict = {} | |
| class EasyUITaskState(TaskState): | |
| """ | |
| EasyUITaskState entity | |
| """ | |
| llm_result: LLMResult | |
| class WorkflowTaskState(TaskState): | |
| """ | |
| WorkflowTaskState entity | |
| """ | |
| answer: str = "" | |
| class StreamEvent(Enum): | |
| """ | |
| Stream event | |
| """ | |
| PING = "ping" | |
| ERROR = "error" | |
| MESSAGE = "message" | |
| MESSAGE_END = "message_end" | |
| TTS_MESSAGE = "tts_message" | |
| TTS_MESSAGE_END = "tts_message_end" | |
| MESSAGE_FILE = "message_file" | |
| MESSAGE_REPLACE = "message_replace" | |
| AGENT_THOUGHT = "agent_thought" | |
| AGENT_MESSAGE = "agent_message" | |
| WORKFLOW_STARTED = "workflow_started" | |
| WORKFLOW_FINISHED = "workflow_finished" | |
| NODE_STARTED = "node_started" | |
| NODE_FINISHED = "node_finished" | |
| PARALLEL_BRANCH_STARTED = "parallel_branch_started" | |
| PARALLEL_BRANCH_FINISHED = "parallel_branch_finished" | |
| ITERATION_STARTED = "iteration_started" | |
| ITERATION_NEXT = "iteration_next" | |
| ITERATION_COMPLETED = "iteration_completed" | |
| TEXT_CHUNK = "text_chunk" | |
| TEXT_REPLACE = "text_replace" | |
| class StreamResponse(BaseModel): | |
| """ | |
| StreamResponse entity | |
| """ | |
| event: StreamEvent | |
| task_id: str | |
| def to_dict(self) -> dict: | |
| return jsonable_encoder(self) | |
| class ErrorStreamResponse(StreamResponse): | |
| """ | |
| ErrorStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.ERROR | |
| err: Exception | |
| model_config = ConfigDict(arbitrary_types_allowed=True) | |
| class MessageStreamResponse(StreamResponse): | |
| """ | |
| MessageStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.MESSAGE | |
| id: str | |
| answer: str | |
| from_variable_selector: Optional[list[str]] = None | |
| class MessageAudioStreamResponse(StreamResponse): | |
| """ | |
| MessageStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.TTS_MESSAGE | |
| audio: str | |
| class MessageAudioEndStreamResponse(StreamResponse): | |
| """ | |
| MessageStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.TTS_MESSAGE_END | |
| audio: str | |
| class MessageEndStreamResponse(StreamResponse): | |
| """ | |
| MessageEndStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.MESSAGE_END | |
| id: str | |
| metadata: dict = {} | |
| files: Optional[Sequence[Mapping[str, Any]]] = None | |
| class MessageFileStreamResponse(StreamResponse): | |
| """ | |
| MessageFileStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.MESSAGE_FILE | |
| id: str | |
| type: str | |
| belongs_to: str | |
| url: str | |
| class MessageReplaceStreamResponse(StreamResponse): | |
| """ | |
| MessageReplaceStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.MESSAGE_REPLACE | |
| answer: str | |
| class AgentThoughtStreamResponse(StreamResponse): | |
| """ | |
| AgentThoughtStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.AGENT_THOUGHT | |
| id: str | |
| position: int | |
| thought: Optional[str] = None | |
| observation: Optional[str] = None | |
| tool: Optional[str] = None | |
| tool_labels: Optional[dict] = None | |
| tool_input: Optional[str] = None | |
| message_files: Optional[list[str]] = None | |
| class AgentMessageStreamResponse(StreamResponse): | |
| """ | |
| AgentMessageStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.AGENT_MESSAGE | |
| id: str | |
| answer: str | |
| class WorkflowStartStreamResponse(StreamResponse): | |
| """ | |
| WorkflowStartStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| workflow_id: str | |
| sequence_number: int | |
| inputs: dict | |
| created_at: int | |
| event: StreamEvent = StreamEvent.WORKFLOW_STARTED | |
| workflow_run_id: str | |
| data: Data | |
| class WorkflowFinishStreamResponse(StreamResponse): | |
| """ | |
| WorkflowFinishStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| workflow_id: str | |
| sequence_number: int | |
| status: str | |
| outputs: Optional[dict] = None | |
| error: Optional[str] = None | |
| elapsed_time: float | |
| total_tokens: int | |
| total_steps: int | |
| created_by: Optional[dict] = None | |
| created_at: int | |
| finished_at: int | |
| files: Optional[Sequence[Mapping[str, Any]]] = [] | |
| event: StreamEvent = StreamEvent.WORKFLOW_FINISHED | |
| workflow_run_id: str | |
| data: Data | |
| class NodeStartStreamResponse(StreamResponse): | |
| """ | |
| NodeStartStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| node_id: str | |
| node_type: str | |
| title: str | |
| index: int | |
| predecessor_node_id: Optional[str] = None | |
| inputs: Optional[dict] = None | |
| created_at: int | |
| extras: dict = {} | |
| parallel_id: Optional[str] = None | |
| parallel_start_node_id: Optional[str] = None | |
| parent_parallel_id: Optional[str] = None | |
| parent_parallel_start_node_id: Optional[str] = None | |
| iteration_id: Optional[str] = None | |
| parallel_run_id: Optional[str] = None | |
| event: StreamEvent = StreamEvent.NODE_STARTED | |
| workflow_run_id: str | |
| data: Data | |
| def to_ignore_detail_dict(self): | |
| return { | |
| "event": self.event.value, | |
| "task_id": self.task_id, | |
| "workflow_run_id": self.workflow_run_id, | |
| "data": { | |
| "id": self.data.id, | |
| "node_id": self.data.node_id, | |
| "node_type": self.data.node_type, | |
| "title": self.data.title, | |
| "index": self.data.index, | |
| "predecessor_node_id": self.data.predecessor_node_id, | |
| "inputs": None, | |
| "created_at": self.data.created_at, | |
| "extras": {}, | |
| "parallel_id": self.data.parallel_id, | |
| "parallel_start_node_id": self.data.parallel_start_node_id, | |
| "parent_parallel_id": self.data.parent_parallel_id, | |
| "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id, | |
| "iteration_id": self.data.iteration_id, | |
| }, | |
| } | |
| class NodeFinishStreamResponse(StreamResponse): | |
| """ | |
| NodeFinishStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| node_id: str | |
| node_type: str | |
| title: str | |
| index: int | |
| predecessor_node_id: Optional[str] = None | |
| inputs: Optional[dict] = None | |
| process_data: Optional[dict] = None | |
| outputs: Optional[dict] = None | |
| status: str | |
| error: Optional[str] = None | |
| elapsed_time: float | |
| execution_metadata: Optional[dict] = None | |
| created_at: int | |
| finished_at: int | |
| files: Optional[Sequence[Mapping[str, Any]]] = [] | |
| parallel_id: Optional[str] = None | |
| parallel_start_node_id: Optional[str] = None | |
| parent_parallel_id: Optional[str] = None | |
| parent_parallel_start_node_id: Optional[str] = None | |
| iteration_id: Optional[str] = None | |
| event: StreamEvent = StreamEvent.NODE_FINISHED | |
| workflow_run_id: str | |
| data: Data | |
| def to_ignore_detail_dict(self): | |
| return { | |
| "event": self.event.value, | |
| "task_id": self.task_id, | |
| "workflow_run_id": self.workflow_run_id, | |
| "data": { | |
| "id": self.data.id, | |
| "node_id": self.data.node_id, | |
| "node_type": self.data.node_type, | |
| "title": self.data.title, | |
| "index": self.data.index, | |
| "predecessor_node_id": self.data.predecessor_node_id, | |
| "inputs": None, | |
| "process_data": None, | |
| "outputs": None, | |
| "status": self.data.status, | |
| "error": None, | |
| "elapsed_time": self.data.elapsed_time, | |
| "execution_metadata": None, | |
| "created_at": self.data.created_at, | |
| "finished_at": self.data.finished_at, | |
| "files": [], | |
| "parallel_id": self.data.parallel_id, | |
| "parallel_start_node_id": self.data.parallel_start_node_id, | |
| "parent_parallel_id": self.data.parent_parallel_id, | |
| "parent_parallel_start_node_id": self.data.parent_parallel_start_node_id, | |
| "iteration_id": self.data.iteration_id, | |
| }, | |
| } | |
| class ParallelBranchStartStreamResponse(StreamResponse): | |
| """ | |
| ParallelBranchStartStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| parallel_id: str | |
| parallel_branch_id: str | |
| parent_parallel_id: Optional[str] = None | |
| parent_parallel_start_node_id: Optional[str] = None | |
| iteration_id: Optional[str] = None | |
| created_at: int | |
| event: StreamEvent = StreamEvent.PARALLEL_BRANCH_STARTED | |
| workflow_run_id: str | |
| data: Data | |
| class ParallelBranchFinishedStreamResponse(StreamResponse): | |
| """ | |
| ParallelBranchFinishedStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| parallel_id: str | |
| parallel_branch_id: str | |
| parent_parallel_id: Optional[str] = None | |
| parent_parallel_start_node_id: Optional[str] = None | |
| iteration_id: Optional[str] = None | |
| status: str | |
| error: Optional[str] = None | |
| created_at: int | |
| event: StreamEvent = StreamEvent.PARALLEL_BRANCH_FINISHED | |
| workflow_run_id: str | |
| data: Data | |
| class IterationNodeStartStreamResponse(StreamResponse): | |
| """ | |
| NodeStartStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| node_id: str | |
| node_type: str | |
| title: str | |
| created_at: int | |
| extras: dict = {} | |
| metadata: dict = {} | |
| inputs: dict = {} | |
| parallel_id: Optional[str] = None | |
| parallel_start_node_id: Optional[str] = None | |
| event: StreamEvent = StreamEvent.ITERATION_STARTED | |
| workflow_run_id: str | |
| data: Data | |
| class IterationNodeNextStreamResponse(StreamResponse): | |
| """ | |
| NodeStartStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| node_id: str | |
| node_type: str | |
| title: str | |
| index: int | |
| created_at: int | |
| pre_iteration_output: Optional[Any] = None | |
| extras: dict = {} | |
| parallel_id: Optional[str] = None | |
| parallel_start_node_id: Optional[str] = None | |
| parallel_mode_run_id: Optional[str] = None | |
| event: StreamEvent = StreamEvent.ITERATION_NEXT | |
| workflow_run_id: str | |
| data: Data | |
| class IterationNodeCompletedStreamResponse(StreamResponse): | |
| """ | |
| NodeCompletedStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| node_id: str | |
| node_type: str | |
| title: str | |
| outputs: Optional[dict] = None | |
| created_at: int | |
| extras: Optional[dict] = None | |
| inputs: Optional[dict] = None | |
| status: WorkflowNodeExecutionStatus | |
| error: Optional[str] = None | |
| elapsed_time: float | |
| total_tokens: int | |
| execution_metadata: Optional[dict] = None | |
| finished_at: int | |
| steps: int | |
| parallel_id: Optional[str] = None | |
| parallel_start_node_id: Optional[str] = None | |
| event: StreamEvent = StreamEvent.ITERATION_COMPLETED | |
| workflow_run_id: str | |
| data: Data | |
| class TextChunkStreamResponse(StreamResponse): | |
| """ | |
| TextChunkStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| text: str | |
| from_variable_selector: Optional[list[str]] = None | |
| event: StreamEvent = StreamEvent.TEXT_CHUNK | |
| data: Data | |
| class TextReplaceStreamResponse(StreamResponse): | |
| """ | |
| TextReplaceStreamResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| text: str | |
| event: StreamEvent = StreamEvent.TEXT_REPLACE | |
| data: Data | |
| class PingStreamResponse(StreamResponse): | |
| """ | |
| PingStreamResponse entity | |
| """ | |
| event: StreamEvent = StreamEvent.PING | |
| class AppStreamResponse(BaseModel): | |
| """ | |
| AppStreamResponse entity | |
| """ | |
| stream_response: StreamResponse | |
| class ChatbotAppStreamResponse(AppStreamResponse): | |
| """ | |
| ChatbotAppStreamResponse entity | |
| """ | |
| conversation_id: str | |
| message_id: str | |
| created_at: int | |
| class CompletionAppStreamResponse(AppStreamResponse): | |
| """ | |
| CompletionAppStreamResponse entity | |
| """ | |
| message_id: str | |
| created_at: int | |
| class WorkflowAppStreamResponse(AppStreamResponse): | |
| """ | |
| WorkflowAppStreamResponse entity | |
| """ | |
| workflow_run_id: Optional[str] = None | |
| class AppBlockingResponse(BaseModel): | |
| """ | |
| AppBlockingResponse entity | |
| """ | |
| task_id: str | |
| def to_dict(self) -> dict: | |
| return jsonable_encoder(self) | |
| class ChatbotAppBlockingResponse(AppBlockingResponse): | |
| """ | |
| ChatbotAppBlockingResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| mode: str | |
| conversation_id: str | |
| message_id: str | |
| answer: str | |
| metadata: dict = {} | |
| created_at: int | |
| data: Data | |
| class CompletionAppBlockingResponse(AppBlockingResponse): | |
| """ | |
| CompletionAppBlockingResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| mode: str | |
| message_id: str | |
| answer: str | |
| metadata: dict = {} | |
| created_at: int | |
| data: Data | |
| class WorkflowAppBlockingResponse(AppBlockingResponse): | |
| """ | |
| WorkflowAppBlockingResponse entity | |
| """ | |
| class Data(BaseModel): | |
| """ | |
| Data entity | |
| """ | |
| id: str | |
| workflow_id: str | |
| status: str | |
| outputs: Optional[dict] = None | |
| error: Optional[str] = None | |
| elapsed_time: float | |
| total_tokens: int | |
| total_steps: int | |
| created_at: int | |
| finished_at: int | |
| workflow_run_id: str | |
| data: Data | |