queue_entities.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. from datetime import datetime
  2. from enum import Enum
  3. from typing import Any, Optional
  4. from pydantic import BaseModel, field_validator
  5. from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk
  6. from core.workflow.entities.node_entities import NodeRunMetadataKey
  7. from core.workflow.graph_engine.entities.graph_runtime_state import GraphRuntimeState
  8. from core.workflow.nodes import NodeType
  9. from core.workflow.nodes.base import BaseNodeData
  10. class QueueEvent(str, Enum):
  11. """
  12. QueueEvent enum
  13. """
  14. LLM_CHUNK = "llm_chunk"
  15. TEXT_CHUNK = "text_chunk"
  16. AGENT_MESSAGE = "agent_message"
  17. MESSAGE_REPLACE = "message_replace"
  18. MESSAGE_END = "message_end"
  19. ADVANCED_CHAT_MESSAGE_END = "advanced_chat_message_end"
  20. WORKFLOW_STARTED = "workflow_started"
  21. WORKFLOW_SUCCEEDED = "workflow_succeeded"
  22. WORKFLOW_FAILED = "workflow_failed"
  23. ITERATION_START = "iteration_start"
  24. ITERATION_NEXT = "iteration_next"
  25. ITERATION_COMPLETED = "iteration_completed"
  26. NODE_STARTED = "node_started"
  27. NODE_SUCCEEDED = "node_succeeded"
  28. NODE_FAILED = "node_failed"
  29. RETRIEVER_RESOURCES = "retriever_resources"
  30. ANNOTATION_REPLY = "annotation_reply"
  31. AGENT_THOUGHT = "agent_thought"
  32. MESSAGE_FILE = "message_file"
  33. PARALLEL_BRANCH_RUN_STARTED = "parallel_branch_run_started"
  34. PARALLEL_BRANCH_RUN_SUCCEEDED = "parallel_branch_run_succeeded"
  35. PARALLEL_BRANCH_RUN_FAILED = "parallel_branch_run_failed"
  36. ERROR = "error"
  37. PING = "ping"
  38. STOP = "stop"
  39. class AppQueueEvent(BaseModel):
  40. """
  41. QueueEvent abstract entity
  42. """
  43. event: QueueEvent
  44. class QueueLLMChunkEvent(AppQueueEvent):
  45. """
  46. QueueLLMChunkEvent entity
  47. Only for basic mode apps
  48. """
  49. event: QueueEvent = QueueEvent.LLM_CHUNK
  50. chunk: LLMResultChunk
  51. class QueueIterationStartEvent(AppQueueEvent):
  52. """
  53. QueueIterationStartEvent entity
  54. """
  55. event: QueueEvent = QueueEvent.ITERATION_START
  56. node_execution_id: str
  57. node_id: str
  58. node_type: NodeType
  59. node_data: BaseNodeData
  60. parallel_id: Optional[str] = None
  61. """parallel id if node is in parallel"""
  62. parallel_start_node_id: Optional[str] = None
  63. """parallel start node id if node is in parallel"""
  64. parent_parallel_id: Optional[str] = None
  65. """parent parallel id if node is in parallel"""
  66. parent_parallel_start_node_id: Optional[str] = None
  67. """parent parallel start node id if node is in parallel"""
  68. start_at: datetime
  69. node_run_index: int
  70. inputs: Optional[dict[str, Any]] = None
  71. predecessor_node_id: Optional[str] = None
  72. metadata: Optional[dict[str, Any]] = None
  73. class QueueIterationNextEvent(AppQueueEvent):
  74. """
  75. QueueIterationNextEvent entity
  76. """
  77. event: QueueEvent = QueueEvent.ITERATION_NEXT
  78. index: int
  79. node_execution_id: str
  80. node_id: str
  81. node_type: NodeType
  82. node_data: BaseNodeData
  83. parallel_id: Optional[str] = None
  84. """parallel id if node is in parallel"""
  85. parallel_start_node_id: Optional[str] = None
  86. """parallel start node id if node is in parallel"""
  87. parent_parallel_id: Optional[str] = None
  88. """parent parallel id if node is in parallel"""
  89. parent_parallel_start_node_id: Optional[str] = None
  90. """parent parallel start node id if node is in parallel"""
  91. parallel_mode_run_id: Optional[str] = None
  92. """iteratoin run in parallel mode run id"""
  93. node_run_index: int
  94. output: Optional[Any] = None # output for the current iteration
  95. @field_validator("output", mode="before")
  96. @classmethod
  97. def set_output(cls, v):
  98. """
  99. Set output
  100. """
  101. if v is None:
  102. return None
  103. if isinstance(v, int | float | str | bool | dict | list):
  104. return v
  105. raise ValueError("output must be a valid type")
  106. class QueueIterationCompletedEvent(AppQueueEvent):
  107. """
  108. QueueIterationCompletedEvent entity
  109. """
  110. event: QueueEvent = QueueEvent.ITERATION_COMPLETED
  111. node_execution_id: str
  112. node_id: str
  113. node_type: NodeType
  114. node_data: BaseNodeData
  115. parallel_id: Optional[str] = None
  116. """parallel id if node is in parallel"""
  117. parallel_start_node_id: Optional[str] = None
  118. """parallel start node id if node is in parallel"""
  119. parent_parallel_id: Optional[str] = None
  120. """parent parallel id if node is in parallel"""
  121. parent_parallel_start_node_id: Optional[str] = None
  122. """parent parallel start node id if node is in parallel"""
  123. start_at: datetime
  124. node_run_index: int
  125. inputs: Optional[dict[str, Any]] = None
  126. outputs: Optional[dict[str, Any]] = None
  127. metadata: Optional[dict[str, Any]] = None
  128. steps: int = 0
  129. error: Optional[str] = None
  130. class QueueTextChunkEvent(AppQueueEvent):
  131. """
  132. QueueTextChunkEvent entity
  133. """
  134. event: QueueEvent = QueueEvent.TEXT_CHUNK
  135. text: str
  136. from_variable_selector: Optional[list[str]] = None
  137. """from variable selector"""
  138. in_iteration_id: Optional[str] = None
  139. """iteration id if node is in iteration"""
  140. class QueueAgentMessageEvent(AppQueueEvent):
  141. """
  142. QueueMessageEvent entity
  143. """
  144. event: QueueEvent = QueueEvent.AGENT_MESSAGE
  145. chunk: LLMResultChunk
  146. class QueueMessageReplaceEvent(AppQueueEvent):
  147. """
  148. QueueMessageReplaceEvent entity
  149. """
  150. event: QueueEvent = QueueEvent.MESSAGE_REPLACE
  151. text: str
  152. class QueueRetrieverResourcesEvent(AppQueueEvent):
  153. """
  154. QueueRetrieverResourcesEvent entity
  155. """
  156. event: QueueEvent = QueueEvent.RETRIEVER_RESOURCES
  157. retriever_resources: list[dict]
  158. in_iteration_id: Optional[str] = None
  159. """iteration id if node is in iteration"""
  160. class QueueAnnotationReplyEvent(AppQueueEvent):
  161. """
  162. QueueAnnotationReplyEvent entity
  163. """
  164. event: QueueEvent = QueueEvent.ANNOTATION_REPLY
  165. message_annotation_id: str
  166. class QueueMessageEndEvent(AppQueueEvent):
  167. """
  168. QueueMessageEndEvent entity
  169. """
  170. event: QueueEvent = QueueEvent.MESSAGE_END
  171. llm_result: Optional[LLMResult] = None
  172. class QueueAdvancedChatMessageEndEvent(AppQueueEvent):
  173. """
  174. QueueAdvancedChatMessageEndEvent entity
  175. """
  176. event: QueueEvent = QueueEvent.ADVANCED_CHAT_MESSAGE_END
  177. class QueueWorkflowStartedEvent(AppQueueEvent):
  178. """
  179. QueueWorkflowStartedEvent entity
  180. """
  181. event: QueueEvent = QueueEvent.WORKFLOW_STARTED
  182. graph_runtime_state: GraphRuntimeState
  183. class QueueWorkflowSucceededEvent(AppQueueEvent):
  184. """
  185. QueueWorkflowSucceededEvent entity
  186. """
  187. event: QueueEvent = QueueEvent.WORKFLOW_SUCCEEDED
  188. outputs: Optional[dict[str, Any]] = None
  189. class QueueWorkflowFailedEvent(AppQueueEvent):
  190. """
  191. QueueWorkflowFailedEvent entity
  192. """
  193. event: QueueEvent = QueueEvent.WORKFLOW_FAILED
  194. error: str
  195. class QueueNodeStartedEvent(AppQueueEvent):
  196. """
  197. QueueNodeStartedEvent entity
  198. """
  199. event: QueueEvent = QueueEvent.NODE_STARTED
  200. node_execution_id: str
  201. node_id: str
  202. node_type: NodeType
  203. node_data: BaseNodeData
  204. node_run_index: int = 1
  205. predecessor_node_id: Optional[str] = None
  206. parallel_id: Optional[str] = None
  207. """parallel id if node is in parallel"""
  208. parallel_start_node_id: Optional[str] = None
  209. """parallel start node id if node is in parallel"""
  210. parent_parallel_id: Optional[str] = None
  211. """parent parallel id if node is in parallel"""
  212. parent_parallel_start_node_id: Optional[str] = None
  213. """parent parallel start node id if node is in parallel"""
  214. in_iteration_id: Optional[str] = None
  215. """iteration id if node is in iteration"""
  216. start_at: datetime
  217. parallel_mode_run_id: Optional[str] = None
  218. """iteratoin run in parallel mode run id"""
  219. class QueueNodeSucceededEvent(AppQueueEvent):
  220. """
  221. QueueNodeSucceededEvent entity
  222. """
  223. event: QueueEvent = QueueEvent.NODE_SUCCEEDED
  224. node_execution_id: str
  225. node_id: str
  226. node_type: NodeType
  227. node_data: BaseNodeData
  228. parallel_id: Optional[str] = None
  229. """parallel id if node is in parallel"""
  230. parallel_start_node_id: Optional[str] = None
  231. """parallel start node id if node is in parallel"""
  232. parent_parallel_id: Optional[str] = None
  233. """parent parallel id if node is in parallel"""
  234. parent_parallel_start_node_id: Optional[str] = None
  235. """parent parallel start node id if node is in parallel"""
  236. in_iteration_id: Optional[str] = None
  237. """iteration id if node is in iteration"""
  238. start_at: datetime
  239. inputs: Optional[dict[str, Any]] = None
  240. process_data: Optional[dict[str, Any]] = None
  241. outputs: Optional[dict[str, Any]] = None
  242. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  243. error: Optional[str] = None
  244. class QueueNodeInIterationFailedEvent(AppQueueEvent):
  245. """
  246. QueueNodeInIterationFailedEvent entity
  247. """
  248. event: QueueEvent = QueueEvent.NODE_FAILED
  249. node_execution_id: str
  250. node_id: str
  251. node_type: NodeType
  252. node_data: BaseNodeData
  253. parallel_id: Optional[str] = None
  254. """parallel id if node is in parallel"""
  255. parallel_start_node_id: Optional[str] = None
  256. """parallel start node id if node is in parallel"""
  257. parent_parallel_id: Optional[str] = None
  258. """parent parallel id if node is in parallel"""
  259. parent_parallel_start_node_id: Optional[str] = None
  260. """parent parallel start node id if node is in parallel"""
  261. in_iteration_id: Optional[str] = None
  262. """iteration id if node is in iteration"""
  263. start_at: datetime
  264. inputs: Optional[dict[str, Any]] = None
  265. process_data: Optional[dict[str, Any]] = None
  266. outputs: Optional[dict[str, Any]] = None
  267. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  268. error: str
  269. class QueueNodeFailedEvent(AppQueueEvent):
  270. """
  271. QueueNodeFailedEvent entity
  272. """
  273. event: QueueEvent = QueueEvent.NODE_FAILED
  274. node_execution_id: str
  275. node_id: str
  276. node_type: NodeType
  277. node_data: BaseNodeData
  278. parallel_id: Optional[str] = None
  279. """parallel id if node is in parallel"""
  280. parallel_start_node_id: Optional[str] = None
  281. """parallel start node id if node is in parallel"""
  282. parent_parallel_id: Optional[str] = None
  283. """parent parallel id if node is in parallel"""
  284. parent_parallel_start_node_id: Optional[str] = None
  285. """parent parallel start node id if node is in parallel"""
  286. in_iteration_id: Optional[str] = None
  287. """iteration id if node is in iteration"""
  288. start_at: datetime
  289. inputs: Optional[dict[str, Any]] = None
  290. process_data: Optional[dict[str, Any]] = None
  291. outputs: Optional[dict[str, Any]] = None
  292. execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
  293. error: str
  294. class QueueAgentThoughtEvent(AppQueueEvent):
  295. """
  296. QueueAgentThoughtEvent entity
  297. """
  298. event: QueueEvent = QueueEvent.AGENT_THOUGHT
  299. agent_thought_id: str
  300. class QueueMessageFileEvent(AppQueueEvent):
  301. """
  302. QueueAgentThoughtEvent entity
  303. """
  304. event: QueueEvent = QueueEvent.MESSAGE_FILE
  305. message_file_id: str
  306. class QueueErrorEvent(AppQueueEvent):
  307. """
  308. QueueErrorEvent entity
  309. """
  310. event: QueueEvent = QueueEvent.ERROR
  311. error: Any = None
  312. class QueuePingEvent(AppQueueEvent):
  313. """
  314. QueuePingEvent entity
  315. """
  316. event: QueueEvent = QueueEvent.PING
  317. class QueueStopEvent(AppQueueEvent):
  318. """
  319. QueueStopEvent entity
  320. """
  321. class StopBy(Enum):
  322. """
  323. Stop by enum
  324. """
  325. USER_MANUAL = "user-manual"
  326. ANNOTATION_REPLY = "annotation-reply"
  327. OUTPUT_MODERATION = "output-moderation"
  328. INPUT_MODERATION = "input-moderation"
  329. event: QueueEvent = QueueEvent.STOP
  330. stopped_by: StopBy
  331. def get_stop_reason(self) -> str:
  332. """
  333. To stop reason
  334. """
  335. reason_mapping = {
  336. QueueStopEvent.StopBy.USER_MANUAL: "Stopped by user.",
  337. QueueStopEvent.StopBy.ANNOTATION_REPLY: "Stopped by annotation reply.",
  338. QueueStopEvent.StopBy.OUTPUT_MODERATION: "Stopped by output moderation.",
  339. QueueStopEvent.StopBy.INPUT_MODERATION: "Stopped by input moderation.",
  340. }
  341. return reason_mapping.get(self.stopped_by, "Stopped by unknown reason.")
  342. class QueueMessage(BaseModel):
  343. """
  344. QueueMessage abstract entity
  345. """
  346. task_id: str
  347. app_mode: str
  348. event: AppQueueEvent
  349. class MessageQueueMessage(QueueMessage):
  350. """
  351. MessageQueueMessage entity
  352. """
  353. message_id: str
  354. conversation_id: str
  355. class WorkflowQueueMessage(QueueMessage):
  356. """
  357. WorkflowQueueMessage entity
  358. """
  359. pass
  360. class QueueParallelBranchRunStartedEvent(AppQueueEvent):
  361. """
  362. QueueParallelBranchRunStartedEvent entity
  363. """
  364. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_STARTED
  365. parallel_id: str
  366. parallel_start_node_id: str
  367. parent_parallel_id: Optional[str] = None
  368. """parent parallel id if node is in parallel"""
  369. parent_parallel_start_node_id: Optional[str] = None
  370. """parent parallel start node id if node is in parallel"""
  371. in_iteration_id: Optional[str] = None
  372. """iteration id if node is in iteration"""
  373. class QueueParallelBranchRunSucceededEvent(AppQueueEvent):
  374. """
  375. QueueParallelBranchRunSucceededEvent entity
  376. """
  377. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_SUCCEEDED
  378. parallel_id: str
  379. parallel_start_node_id: str
  380. parent_parallel_id: Optional[str] = None
  381. """parent parallel id if node is in parallel"""
  382. parent_parallel_start_node_id: Optional[str] = None
  383. """parent parallel start node id if node is in parallel"""
  384. in_iteration_id: Optional[str] = None
  385. """iteration id if node is in iteration"""
  386. class QueueParallelBranchRunFailedEvent(AppQueueEvent):
  387. """
  388. QueueParallelBranchRunFailedEvent entity
  389. """
  390. event: QueueEvent = QueueEvent.PARALLEL_BRANCH_RUN_FAILED
  391. parallel_id: str
  392. parallel_start_node_id: str
  393. parent_parallel_id: Optional[str] = None
  394. """parent parallel id if node is in parallel"""
  395. parent_parallel_start_node_id: Optional[str] = None
  396. """parent parallel start node id if node is in parallel"""
  397. in_iteration_id: Optional[str] = None
  398. """iteration id if node is in iteration"""
  399. error: str